Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

před 3 roky
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297
  1. <?php
  2. namespace backend\modules\hotel\models;
  3. use backend\modules\api\controllers\BalanceController;
  4. use backend\modules\api\logic\BaseBalance;
  5. use backend\modules\hotel\models\Ali\TopLogger;
  6. use backend\modules\zzcs\models\BaseUser;
  7. use backend\modules\zzcs\models\DictType;
  8. use backend\modules\zzcs\models\OrderFinanceReparations;
  9. use common\components\zHttp;
  10. use common\components\zOfficeWechat;
  11. use common\models\BaseSupplier;
  12. use common\models\BaseUserAuth;
  13. use Yii;
  14. use yii\data\ActiveDataProvider;
  15. use yii\data\SqlDataProvider;
  16. use yii\db\ActiveRecord;
  17. use yii\db\Exception;
  18. use common\components\zPhpWord;
  19. /**
  20. * This is the model class for table "order_main".
  21. *
  22. * @property integer $ID
  23. * @property integer $CANCEL_FLAG
  24. * @property integer $MAIN_CREATE_USER_ID
  25. * @property integer $CREATE_USER_ID
  26. * @property string $CREATE_TIME
  27. * @property integer $UPDATE_USER_ID
  28. * @property string $UPDATE_TIME
  29. * @property integer $SALE_ORG_ID
  30. * @property integer $SALE_TOP_ORG_ID
  31. * @property integer $PROD_TOP_ORG_ID
  32. * @property integer $ORDER_ID
  33. * @property string $ORDER_DESCRIPTION
  34. * @property string $OUTSIDE_ORDER_NO
  35. * @property integer $ORDER_VALID_STATUS
  36. * @property integer $ORDER_BOOK_STATUS
  37. * @property integer $ORDER_PAY_STATUS
  38. * @property integer $ORDER_PAY_MAIN_ID
  39. * @property integer $ORDER_PAY_USER_ID
  40. * @property string $ORDER_PAY_TIME
  41. * @property integer $ORDER_PRINT_TIMES
  42. * @property integer $PARENT_ORDER_ID
  43. * @property integer $PROD_ID //子房型编号 ROOM_TYPE
  44. * @property integer $PARENT_PROD_ID //酒店ID
  45. * @property string $PROD_NAME //房型名称
  46. * @property string $PARENT_PROD_NAME //酒店名字
  47. * @property string $ORDER_PRICE
  48. * @property string $ORDER_PROD_TYPE
  49. * @property string $PROD_SUPPLY_ORG_NAME
  50. * @property string $BASE_PRICE
  51. * @property string $MID_PRICE
  52. * @property integer $RUN_ID
  53. * @property string $RUN_DATE
  54. * @property integer $RUN_DATE_NUM
  55. * @property string $RUN_TIME
  56. * @property integer $RUN_TIME_MINUTES
  57. * @property integer $RUN_BUS_ORDER_ID
  58. * @property integer $RUN_BUS_SEAT_TYPE
  59. * @property integer $RUN_BUS_SEAT_SEQ_ID
  60. * @property integer $RUN_BUS_SEAT_ID
  61. * @property string $RUN_BUS_SEAT_NAME
  62. * @property integer $PROD_START_STATION_RES_ID
  63. * @property string $PROD_START_STATION_RES_NAME
  64. * @property integer $PROD_START_STATION_CHECKPORT_RES_ID
  65. * @property string $PROD_START_STATION_CHECKPORT_RES_NAME
  66. * @property integer $PROD_START_STATION_SEQ_ID
  67. * @property string $PROD_START_STATION_DATE //入住日期
  68. * @property integer $PROD_START_STATION_DATE_NUM
  69. * @property string $PROD_START_STATION_TIME
  70. * @property integer $PROD_START_STATION_TIME_MINUTES
  71. * @property integer $PROD_START_STATION_AREA_ID
  72. * @property string $PROD_START_STATION_AREA_NAME
  73. * @property integer $PROD_END_STATION_RES_ID
  74. * @property string $PROD_END_STATION_RES_NAME
  75. * @property integer $PROD_END_STATION_SEQ_ID
  76. * @property string $PROD_END_STATION_DATE
  77. * @property integer $PROD_END_STATION_DATE_NUM
  78. * @property string $PROD_END_STATION_TIME
  79. * @property integer $PROD_END_STATION_TIME_MINUTES
  80. * @property integer $PROD_END_STATION_AREA_ID
  81. * @property string $PROD_END_STATION_AREA_NAME
  82. * @property string $CUSTOMER_NAME
  83. * @property integer $CUSTOMER_SEX
  84. * @property string $CUSTOMER_MOBILE
  85. * @property integer $CUSTOMER_ID_TYPE
  86. * @property string $CUSTOMER_ID_NO
  87. * @property string $CUSTOMER_ADDRESS
  88. * @property integer $CUSTOMER_ADDRESS_AREA_ID
  89. * @property string $CUSTOMER_POSTCODE
  90. * @property string $CUSTOMER_MEMO
  91. * @property integer $MEMBER_ID
  92. * @property integer $MEMBER_SCORE_PAY
  93. * @property integer $MEMBER_SCORE_GET
  94. * @property integer $ORDER_STATUS
  95. * @property integer $CHANNEL_ORDER_STATUS
  96. * @property integer $ORDER_DISABLE_TYPE
  97. * @property integer $ORDER_DISABLE_USER_ID
  98. * @property string $ORDER_DISABLE_TIME
  99. * @property string $ORDER_DISABLE_PERCENT
  100. * @property string $ORDER_DISABLE_FEE
  101. * @property integer $ORDER_DISABLE_APPLY_USER_ID
  102. * @property string $ORDER_DISABLE_APPLY_TIME
  103. * @property string $KEEP_END_TIME
  104. * @property integer $KEEP_END_MINUTES
  105. * @property integer $if_gift
  106. * @property integer $reorder_times
  107. * @property integer $IF_LAST_PROD
  108. * @property integer $ORDER_LEVEL
  109. * @property string $ORDER_CONFIRM_CODE
  110. * @property integer $OUTSIDE_SALE_ORG_ID
  111. * @property integer $IS_UP
  112. * @property integer $APPLY_ID
  113. * @property string $SALES_MAN
  114. * @property string $RECEIVE_VALUE
  115. * @property integer $REAL_PASSENGER_NUM
  116. * @property integer $STOCK_TYPE
  117. * @property integer $REFUSE_FLAG
  118. * @property string $PROFIT_VALUE
  119. * @property string $TOTAL_COMMISSION
  120. * @property string $DOCKING_TYPE
  121. */
  122. class OrderMain extends ActiveRecord
  123. {
  124. const ORDER_CHANNEL_STATUS_PAYING = 708; //渠道待支付
  125. const ORDER_CHANNEL_STATUS_WAITING = 550; //待处理
  126. const ORDER_CHANNEL_STATUS_ACCEPT = 551; //已接单
  127. const ORDER_CHANNEL_STATUS_REJECT = 552; //已拒绝
  128. const ORDER_CHANNEL_STATUS_APPLY_CANCEL = 553; //申请取消
  129. const ORDER_CHANNEL_STATUS_APPLY_CANCEL_REJECT = 554; //取消被拒
  130. const ORDER_CHANNEL_STATUS_APPLY_CANCEL_WAITING_CONFIRM = 564; //退单待确认 并不是渠道订单状态,仍然是CS订单状态
  131. const ORDER_CHANNEL_STATUS_APPLY_CANCEL_CONFIRMED = 563; //已同意取消
  132. const ORDER_CHANNEL_STATUS_APPLY_MODIFY = 713; //申请修改
  133. const ORDER_CHANNEL_STATUS_MODIFY_REJECT = 714; //拒绝修改
  134. const ORDER_STATUS_NO_PAID = 145; //订单待支付
  135. const ORDER_STATUS_WAITING_SEND = 313; //待发单
  136. const ORDER_STATUS_WAITING_CONFIRM = 198; //待确认
  137. const ORDER_STATUS_CONFIRMED = 314; //已确认
  138. const ORDER_STATUS_CHANGING = 382; //退改中
  139. const ORDER_STATUS_CANCEL_BEFORE_CONFIRM = 383; //已取消 已安排情况下发退改后取消
  140. const ORDER_STATUS_FINISH = 147; //已完成
  141. const ORDER_STATUS_CANCEL = 148; //已取消
  142. const ORDER_PROD_TYPE_MAIN = 25; //主订单
  143. const ORDER_PROD_TYPE_SUM = 26; //子订单
  144. const ORDER_TYPE_CHANNEL = 556; //直连
  145. const ORDER_TYPE_CS = 557; //录单
  146. const ORDER_DISABLE_TYPE_CONFIRMED = 1; //同意退单
  147. const ORDER_DISABLE_TYPE_REJECT = 2; //拒绝退单
  148. const ORDER_LEVEL_SURE = 0; //确认单
  149. const ORDER_LEVEL_CHANGE = 1; //修改单
  150. const ORDER_LEVEL_CANCEL = 2; //取消单
  151. const STOCK_TYPE_BUYOUT = 228; //买断
  152. const STOCK_TYPE_RESERVE = 230; //保留
  153. const STOCK_TYPE_INQUIRY = 229; //现询
  154. const DISTRIB_STOCK_TYPE_RESERVE = 1; //消耗渠道的库存类型 1:固定数量(保留)
  155. const DISTRIB_STOCK_TYPE_INQUIRY = 2; //2: 超卖(现询房)
  156. const order_level_array = [
  157. self::ORDER_LEVEL_SURE => '确认单',
  158. self::ORDER_LEVEL_CHANGE => '修改单',
  159. self::ORDER_LEVEL_CANCEL => '取消单',
  160. ];
  161. public $purchaser_id;
  162. public $purchase_id;
  163. public $date_type = 1; //查询时的时间类型,1:创建时间,2:入住时间,3:离店时间
  164. public $start_date;
  165. public $end_date;
  166. public $hotel_name;
  167. public $hotel_id;
  168. public $room_count; //订单间夜数
  169. public $principal_id; //运营负责人;
  170. public $compensate_out; // 赔出
  171. public $compensate_in; // 赔入
  172. public $jianye_count; //间夜数
  173. public $order_count; //订单数
  174. public $order_price; //销售额
  175. public $base_price; //成本价
  176. public $total_commission; //佣金
  177. public $profit_value; //利润
  178. public $principal; //运营负责人
  179. public $order_status_name; // 订单状态名称
  180. public $channel_name; // 渠道名称
  181. public $docking_type_desc; // 对接类型名称
  182. public $sendUser = 'shifp|wanglg'; // 酒店相关信息通知用户
  183. /**
  184. * @inheritdoc
  185. */
  186. public static function tableName()
  187. {
  188. return 'order_main';
  189. }
  190. /**
  191. * @inheritdoc
  192. */
  193. public function rules()
  194. {
  195. return [
  196. [['ID', 'ORDER_BOOK_STATUS', 'PROD_START_STATION_TIME_MINUTES', 'OUTSIDE_ORDER_NO', 'BASE_PRICE', 'ORDER_PRICE'], 'required'],
  197. [['ID', 'CANCEL_FLAG', 'MAIN_CREATE_USER_ID', 'CREATE_USER_ID', 'UPDATE_USER_ID', 'SALE_ORG_ID', 'SALE_TOP_ORG_ID', 'PROD_TOP_ORG_ID', 'ORDER_ID',
  198. 'ORDER_VALID_STATUS', 'ORDER_BOOK_STATUS', 'ORDER_PAY_STATUS', 'ORDER_PAY_MAIN_ID', 'ORDER_PAY_USER_ID', 'ORDER_PRINT_TIMES', 'PARENT_ORDER_ID',
  199. 'PROD_ID', 'PARENT_PROD_ID', 'ORDER_PROD_TYPE', 'RUN_ID', 'RUN_DATE_NUM', 'RUN_TIME_MINUTES', 'RUN_BUS_ORDER_ID', 'RUN_BUS_SEAT_TYPE', 'RUN_BUS_SEAT_SEQ_ID',
  200. 'RUN_BUS_SEAT_ID', 'PROD_START_STATION_RES_ID', 'PROD_START_STATION_CHECKPORT_RES_ID', 'PROD_START_STATION_SEQ_ID', 'PROD_START_STATION_DATE_NUM',
  201. 'PROD_START_STATION_TIME_MINUTES', 'PROD_START_STATION_AREA_ID', 'PROD_END_STATION_RES_ID', 'PROD_END_STATION_SEQ_ID', 'PROD_END_STATION_DATE_NUM',
  202. 'PROD_END_STATION_TIME_MINUTES', 'PROD_END_STATION_AREA_ID', 'CUSTOMER_SEX', 'CUSTOMER_ID_TYPE', 'CUSTOMER_ADDRESS_AREA_ID', 'MEMBER_ID', 'MEMBER_SCORE_PAY',
  203. 'MEMBER_SCORE_GET', 'CHANNEL_ORDER_STATUS', 'ORDER_STATUS', 'ORDER_DISABLE_TYPE', 'ORDER_DISABLE_USER_ID', 'ORDER_DISABLE_APPLY_USER_ID', 'KEEP_END_MINUTES',
  204. 'if_gift', 'reorder_times', 'IF_LAST_PROD', 'ORDER_LEVEL', 'OUTSIDE_SALE_ORG_ID', 'IS_UP', 'APPLY_ID', 'REAL_PASSENGER_NUM', 'STOCK_TYPE', 'REFUSE_FLAG', 'hotel_id'], 'integer'],
  205. [['ORDER_DESCRIPTION'], 'string'],
  206. [['room_count'], 'match', 'pattern' => '/^[1-9]\d*$/', 'message' => '库存信息不能为空', 'on' => 'csBook'],
  207. [['OUTSIDE_ORDER_NO', 'OUTSIDE_SALE_ORG_ID', 'CUSTOMER_NAME', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE'], 'required', 'on' => 'csBook'],
  208. [['ORDER_PRICE', 'BASE_PRICE', 'MID_PRICE', 'ORDER_DISABLE_PERCENT', 'ORDER_DISABLE_FEE', 'RECEIVE_VALUE', 'PROFIT_VALUE', 'TOTAL_COMMISSION'], 'number'],
  209. [['CREATE_TIME', 'UPDATE_TIME', 'RUN_DATE', 'PROD_START_STATION_DATE', 'PROD_END_STATION_DATE', 'ORDER_DISABLE_TIME', 'ORDER_DISABLE_APPLY_TIME', 'KEEP_END_TIME'], 'string', 'max' => 20],
  210. [['OUTSIDE_ORDER_NO', 'PROD_NAME', 'PARENT_PROD_NAME', 'CUSTOMER_ADDRESS'], 'string', 'max' => 200],
  211. [['ORDER_PAY_TIME'], 'string', 'max' => 255],
  212. [['PROD_SUPPLY_ORG_NAME', 'RUN_BUS_SEAT_NAME', 'PROD_START_STATION_RES_NAME', 'PROD_START_STATION_CHECKPORT_RES_NAME', 'PROD_START_STATION_AREA_NAME', 'PROD_END_STATION_RES_NAME', 'PROD_END_STATION_AREA_NAME', 'CUSTOMER_NAME', 'CUSTOMER_MOBILE', 'CUSTOMER_ID_NO', 'CUSTOMER_POSTCODE'], 'string', 'max' => 100],
  213. [['RUN_TIME', 'PROD_START_STATION_TIME', 'PROD_END_STATION_TIME'], 'string', 'max' => 10],
  214. [['CUSTOMER_MEMO'], 'string', 'max' => 500],
  215. [['ORDER_CONFIRM_CODE', 'SALES_MAN'], 'string', 'max' => 80],
  216. [['DOCKING_TYPE', 'room_count', 'ORDER_TITLE_ID', 'PRINCIPAL_ID'], 'safe'],
  217. // [['ORDER_CONFIRM_CODE'], 'number', 'skipOnEmpty' => true],
  218. [['ORDER_CONFIRM_CODE'], 'match', 'pattern' => '/[^\x{4e00}-\x{9fa5}]+$/u', 'message' => '确认号中不能出现中文字符', 'skipOnEmpty' => true],
  219. [['ORDER_CONFIRM_CODE'], 'required', 'on' => 'upConfirm'],
  220. ];
  221. }
  222. /**
  223. * @inheritdoc
  224. */
  225. public function attributeLabels()
  226. {
  227. return [
  228. 'ID' => 'ID',
  229. 'CANCEL_FLAG' => 'Cancel Flag',
  230. 'MAIN_CREATE_USER_ID' => 'Main Create User ID',
  231. 'CREATE_USER_ID' => '跟单客服',
  232. 'CREATE_TIME' => '预订时间',
  233. 'UPDATE_USER_ID' => 'Update User ID',
  234. 'UPDATE_TIME' => 'Update Time',
  235. 'SALE_ORG_ID' => 'Sale Org ID',
  236. 'SALE_TOP_ORG_ID' => 'Sale Top Org ID',
  237. 'PROD_TOP_ORG_ID' => 'Prod Top Org ID', //供应商ID
  238. 'ORDER_ID' => '订单号',
  239. 'ORDER_DESCRIPTION' => 'Order Description',
  240. 'OUTSIDE_ORDER_NO' => '渠道商订单号',
  241. 'ORDER_VALID_STATUS' => 'Order Valid Status',
  242. 'ORDER_BOOK_STATUS' => 'Order Book Status',
  243. 'ORDER_PAY_STATUS' => 'Order Pay Status',
  244. 'ORDER_PAY_MAIN_ID' => 'Order Pay Main ID',
  245. 'ORDER_PAY_USER_ID' => 'Order Pay User ID',
  246. 'ORDER_PAY_TIME' => 'Order Pay Time',
  247. 'ORDER_PRINT_TIMES' => 'Order Print Times',
  248. 'PARENT_ORDER_ID' => 'Parent Order ID',
  249. 'PROD_ID' => 'Prod ID',
  250. 'PARENT_PROD_ID' => 'Parent Prod ID',
  251. 'PROD_NAME' => '房型名称',
  252. 'PARENT_PROD_NAME' => '酒店名称',
  253. 'ORDER_PRICE' => '订单金额',
  254. 'ORDER_PROD_TYPE' => 'Order Prod Type',
  255. 'PROD_SUPPLY_ORG_NAME' => 'Prod Supply Org Name',
  256. 'BASE_PRICE' => '订单金额',
  257. 'MID_PRICE' => 'Mid Price',
  258. 'RUN_ID' => 'Run ID',
  259. 'RUN_DATE' => 'Run Date',
  260. 'RUN_DATE_NUM' => 'Run Date Num',
  261. 'RUN_TIME' => 'Run Time',
  262. 'RUN_TIME_MINUTES' => 'Run Time Minutes',
  263. 'RUN_BUS_ORDER_ID' => 'Run Bus Order ID',
  264. 'RUN_BUS_SEAT_TYPE' => 'Run Bus Seat Type',
  265. 'RUN_BUS_SEAT_SEQ_ID' => 'Run Bus Seat Seq ID',
  266. 'RUN_BUS_SEAT_ID' => 'Run Bus Seat ID',
  267. 'RUN_BUS_SEAT_NAME' => 'Run Bus Seat Name',
  268. 'PROD_START_STATION_RES_ID' => 'Prod Start Station Res ID',
  269. 'PROD_START_STATION_RES_NAME' => 'Prod Start Station Res Name',
  270. 'PROD_START_STATION_CHECKPORT_RES_ID' => 'Prod Start Station Checkport Res ID',
  271. 'PROD_START_STATION_CHECKPORT_RES_NAME' => 'Prod Start Station Checkport Res Name',
  272. 'PROD_START_STATION_SEQ_ID' => 'Prod Start Station Seq ID',
  273. 'PROD_START_STATION_DATE' => '入住日期', //入住日期
  274. 'PROD_START_STATION_DATE_NUM' => 'Prod Start Station Date Num',
  275. 'PROD_START_STATION_TIME' => 'Prod Start Station Time',
  276. 'PROD_START_STATION_TIME_MINUTES' => 'Prod Start Station Time Minutes',
  277. 'PROD_START_STATION_AREA_ID' => 'Prod Start Station Area ID',
  278. 'PROD_START_STATION_AREA_NAME' => 'Prod Start Station Area Name',
  279. 'PROD_END_STATION_RES_ID' => 'Prod End Station Res ID',
  280. 'PROD_END_STATION_RES_NAME' => 'Prod End Station Res Name',
  281. 'PROD_END_STATION_SEQ_ID' => 'Prod End Station Seq ID',
  282. 'PROD_END_STATION_DATE' => '入离店时间', //离店时间
  283. 'PROD_END_STATION_DATE_NUM' => 'Prod End Station Date Num',
  284. 'PROD_END_STATION_TIME' => 'Prod End Station Time',
  285. 'PROD_END_STATION_TIME_MINUTES' => 'Prod End Station Time Minutes',
  286. 'PROD_END_STATION_AREA_ID' => 'Prod End Station Area ID',
  287. 'PROD_END_STATION_AREA_NAME' => 'Prod End Station Area Name',
  288. 'CUSTOMER_NAME' => '客人姓名',
  289. 'CUSTOMER_SEX' => 'Customer Sex',
  290. 'CUSTOMER_MOBILE' => '联系电话',
  291. 'CUSTOMER_ID_TYPE' => 'Customer Id Type',
  292. 'CUSTOMER_ID_NO' => 'Customer Id No',
  293. 'CUSTOMER_ADDRESS' => 'Customer Address',
  294. 'CUSTOMER_ADDRESS_AREA_ID' => 'Customer Address Area ID',
  295. 'CUSTOMER_POSTCODE' => 'Customer Postcode',
  296. 'CUSTOMER_MEMO' => '备注', //备注已经移到order_comment表
  297. 'MEMBER_ID' => 'Member ID',
  298. 'MEMBER_SCORE_PAY' => 'Member Score Pay',
  299. 'MEMBER_SCORE_GET' => 'Member Score Get',
  300. 'ORDER_STATUS' => '订单状态',
  301. 'ORDER_DISABLE_TYPE' => 'Order Disable Type',
  302. 'ORDER_DISABLE_USER_ID' => 'Order Disable User ID',
  303. 'ORDER_DISABLE_TIME' => 'Order Disable Time',
  304. 'ORDER_DISABLE_PERCENT' => 'Order Disable Percent',
  305. 'ORDER_DISABLE_FEE' => 'Order Disable Fee',
  306. 'ORDER_DISABLE_APPLY_USER_ID' => 'Order Disable Apply User ID',
  307. 'ORDER_DISABLE_APPLY_TIME' => 'Order Disable Apply Time',
  308. 'KEEP_END_TIME' => 'Keep End Time',
  309. 'KEEP_END_MINUTES' => 'Keep End Minutes',
  310. 'if_gift' => 'If Gift',
  311. 'reorder_times' => 'Reorder Times',
  312. 'IF_LAST_PROD' => 'If Last Prod',
  313. 'ORDER_LEVEL' => 'Order Level',
  314. 'ORDER_CONFIRM_CODE' => '确认号',
  315. 'OUTSIDE_SALE_ORG_ID' => '销售渠道', //渠道商ID
  316. 'IS_UP' => 'Is Up',
  317. 'APPLY_ID' => 'Apply ID',
  318. 'SALES_MAN' => 'Sales Man',
  319. 'RECEIVE_VALUE' => 'Receive Value',
  320. 'REAL_PASSENGER_NUM' => 'Real Passenger Num',
  321. 'STOCK_TYPE' => 'Stock Type',
  322. 'REFUSE_FLAG' => 'Refuse Flag',
  323. 'PROFIT_VALUE' => 'Profit Value',
  324. 'TOTAL_COMMISSION' => 'Total Commission',
  325. 'room_count' => '间夜数',
  326. ];
  327. }
  328. /**
  329. * @return \yii\db\ActiveQuery 酒店
  330. */
  331. public function getOperaHotel()
  332. {
  333. return $this->hasOne(OperaHotel::className(), ['HOTEL_ID' => 'PARENT_PROD_ID']);
  334. }
  335. /**
  336. * @return \yii\db\ActiveQuery 直连发单
  337. */
  338. public function getOrderHtStatusLog()
  339. {
  340. return $this->hasOne(OrderHtStatusLog::className(), ['ORDER_ID' => 'ORDER_ID']);
  341. }
  342. /**
  343. * @return \yii\db\ActiveQuery 供应商
  344. */
  345. public function getBaseSupplier()
  346. {
  347. return $this->hasOne(BaseSupplier::className(), ['ID' => 'PROD_TOP_ORG_ID']);
  348. }
  349. /**
  350. * @return \yii\db\ActiveQuery 渠道商
  351. */
  352. public function getBaseChannel()
  353. {
  354. return $this->hasOne(BaseSupplier::className(), ['ID' => 'OUTSIDE_SALE_ORG_ID']);
  355. }
  356. /**
  357. * @return \yii\db\ActiveQuery 订单状态
  358. */
  359. public function getStatusLabel()
  360. {
  361. return $this->hasOne(DictType::className(), ['ID' => 'ORDER_STATUS']);
  362. }
  363. /**
  364. * @return \yii\db\ActiveQuery 渠道接单状态
  365. */
  366. public function getChannelStatusLabel()
  367. {
  368. return $this->hasOne(DictType::className(), ['ID' => 'CHANNEL_ORDER_STATUS']);
  369. }
  370. public function getDockingType()
  371. {
  372. return $this->hasOne(DictType::className(), ['ID' => 'DOCKING_TYPE']);
  373. }
  374. public function getChannelOrderStatus()
  375. {
  376. return $this->hasOne(DictType::className(), ['ID' => 'CHANNEL_ORDER_STATUS']);
  377. }
  378. public function getOperaHotelRoom()
  379. {
  380. return $this->hasOne(OperaHotelRoom::className(), ['HOTEL_ID' => 'PARENT_PROD_ID', 'ROOM_TYPE' => 'PROD_ID'])
  381. ->andOnCondition([OperaHotelRoom::tableName() . '.CANCEL_FLAG' => 0]);
  382. }
  383. public function getOrderInvoiceInfo()
  384. {
  385. return $this->hasOne(OrderInvoiceInfo::className(), ['OrderID' => 'ORDER_ID']);
  386. }
  387. public function getOrderFinanceReparations()
  388. {
  389. return $this->hasOne(OrderFinanceReparations::className(), ['order_id' => 'ORDER_ID'])
  390. ->andOnCondition([OrderFinanceReparations::tableName() . '.CANCEL_FLAG' => 0]);
  391. }
  392. public function getChannelRoom()
  393. {
  394. return $this->hasOne(RunHotelDistrib::className(), [
  395. 'HOTEL_ID' => 'PARENT_PROD_ID',
  396. 'ROOM_TYPE' => 'PROD_ID',
  397. 'RUN_DATE' => 'RUN_DATE',
  398. 'DISTRIB_ID' => 'OUTSIDE_SALE_ORG_ID']);
  399. }
  400. public function getSubRoom()
  401. {
  402. return $this->hasOne(RunHotelSubRoom::className(), [
  403. 'HOTEL_ID' => 'PARENT_PROD_ID',
  404. 'ROOM_TYPE' => 'PROD_ID',
  405. 'RUN_DATE' => 'RUN_DATE']);
  406. }
  407. /**
  408. * @return \yii\db\ActiveQuery 客服
  409. */
  410. public function getUser()
  411. {
  412. return $this->hasOne(BaseUser::className(), ['ID' => 'CREATE_USER_ID']);
  413. }
  414. /**
  415. * @Author wanglg
  416. * @Desc 运营负责人
  417. * @return \yii\db\ActiveQuery
  418. */
  419. public function getPrincipalMan()
  420. {
  421. return $this->hasOne(BaseUser::className(), ['ID' => 'PRINCIPAL_ID']);
  422. }
  423. /**
  424. * @Author wanglg
  425. * @Desc 采购负责人
  426. * @return \yii\db\ActiveQuery
  427. */
  428. public function getSalesMan()
  429. {
  430. return $this->hasOne(BaseUser::className(), ['ID' => 'SALES_MAN']);
  431. }
  432. //订单备注
  433. public function getPublicMemo()
  434. {
  435. return $this->hasMany(OrderComment::className(), ['ORDER_ID' => 'ORDER_ID'])
  436. ->andOnCondition(['order_comment.COMMENT_TYPE' => OrderComment::TYPE_PUBLIC, 'order_comment.CANCEL_FLAG' => 0]);
  437. }
  438. //获取所有订单备注
  439. public function getAllMemo()
  440. {
  441. return $this->hasMany(OrderComment::className(), ['ORDER_ID' => 'ORDER_ID'])
  442. ->andOnCondition(['order_comment.CANCEL_FLAG' => 0, 'order_comment.COMMENT_TYPE' => [0, 1]]);
  443. }
  444. public function getOrderFinanceStatus()
  445. {
  446. return $this->hasOne(OrderFinanceStatus::className(), ['order_id' => 'ORDER_ID']);
  447. }
  448. public function getSendOrderUser()
  449. {
  450. return $this->hasOne(OrderHtStatusLog::className(), ['ORDER_ID' => 'ORDER_ID'])
  451. ->andOnCondition(['order_ht_status_log.CANCEL_FLAG' => 0, 'order_ht_status_log.ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_CONFIRM]);
  452. }
  453. /**
  454. * @Author wanglg
  455. * @Desc 统计报表查询订单信息
  456. * @param $params
  457. * @return SqlDataProvider
  458. */
  459. public function search($params)
  460. {
  461. $op = isset($_REQUEST['op']) ? $_REQUEST['op'] : '';
  462. if ($op == 'cusServiceSend') {
  463. $query = OrderMain::find()
  464. ->joinWith('baseChannel c')
  465. ->joinWith('statusLabel')
  466. ->joinWith('user')
  467. ->joinWith('salesMan m')
  468. ->joinWith('orderHtStatusLog.user as lu')
  469. ->from($this->tableName() . ' t');
  470. } else {
  471. $query = OrderMain::find()
  472. ->joinWith('baseChannel c')
  473. ->joinWith('salesMan m')
  474. ->joinWith('statusLabel')
  475. ->joinWith('user')
  476. ->from($this->tableName() . ' t');
  477. }
  478. //间夜数,添加select时,需要注意,如果数据库中其他表有主键,$dataProvider->getModels()会自动以主键去除重复。所以返回的结果有可能比sql查出来的少
  479. $query->select(['t.CREATE_TIME', 't.CREATE_USER_ID', 't.SALES_MAN as SALES_MAN', 't.PRINCIPAL_ID', 't.ORDER_ID', 't.PARENT_PROD_ID', 't.PROD_ID', 't.CUSTOMER_NAME',
  480. 't.CUSTOMER_MOBILE', 't.PARENT_PROD_NAME', 't.PROD_NAME', 't.OUTSIDE_SALE_ORG_ID', 't.PROD_START_STATION_DATE', 't.PROD_END_STATION_DATE',
  481. 't.ORDER_PRICE', 't.BASE_PRICE', 't.TOTAL_COMMISSION', 't.PROFIT_VALUE', 'c.SUPPLIER_NAME as CHANNEL_NAME', 'base_user.TRUE_NAME AS INPUT_CREATE_USER',
  482. 'm.TRUE_NAME AS PURCHASE_TRUE_NAME', 'dict_type.TYPE_NAME AS ORDER_STATUS_NAME',
  483. 'IF(0=0, 0, 0) as order_count', 'IF(0=0, 0, 0) AS compensate_out', 'IF(0=0, 0, 0) AS compensate_in']);
  484. $this->PARENT_PROD_ID = isset($params['hotel_id']) ? $params['hotel_id'] : ''; //酒店
  485. $this->OUTSIDE_SALE_ORG_ID = (isset($params['org_sale_id']) && $params['org_sale_id'] != 0) ? $params['org_sale_id'] : ''; //渠道
  486. $this->CREATE_USER_ID = isset($params['user_id']) ? $params['user_id'] : '';
  487. $this->principal_id = empty($params['principal_id']) ? '' : $params['principal_id'];
  488. $this->date_type = isset($params['date_type']) ? $params['date_type'] : '';
  489. $this->purchaser_id = empty($params['purchaser_id']) ? '' : $params['purchaser_id'];
  490. $this->start_date = isset($params['start_date']) ? $params['start_date'] : '';
  491. $this->end_date = isset($params['end_date']) ? $params['end_date'] : '';
  492. $this->PROD_ID = isset($params['room_type']) ? $params['room_type'] : '';
  493. $this->PARENT_PROD_NAME = isset($params['hotel_name']) ? $params['hotel_name'] : '';
  494. if ($op == 'cusServiceSend') {
  495. $query->addSelect(['order_ht_status_log.CREATE_USER_ID AS SEND_USER_ID', 'lu.TRUE_NAME AS SEND_CREATE_USER']);
  496. $query->andFilterWhere([
  497. 'OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID,
  498. 'order_prod_type' => 25,
  499. 't.cancel_flag' => 0,
  500. 'ORDER_VALID_STATUS' => 1,
  501. 't.DOCKING_TYPE' => 556,
  502. 'PROD_ID' => $this->PROD_ID,
  503. 't.SALES_MAN' => $this->purchaser_id,
  504. 't.PRINCIPAL_ID' => $this->principal_id,
  505. ]);
  506. } else {
  507. $query->andFilterWhere([
  508. 'OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID,
  509. 'order_prod_type' => 25,
  510. 't.cancel_flag' => 0,
  511. 'ORDER_VALID_STATUS' => 1,
  512. 'prod_id' => $this->PROD_ID,
  513. 't.create_user_id' => $this->CREATE_USER_ID,
  514. 't.SALES_MAN' => $this->purchaser_id,
  515. 't.PRINCIPAL_ID' => $this->principal_id,
  516. ]);
  517. }
  518. if ($op == 'cusServiceSend') {
  519. $send_where = empty($params['send_user_id']) ? ['order_ht_status_log.ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_CONFIRM, 'order_ht_status_log.BEFORE_STATUS' => OrderMain::ORDER_STATUS_WAITING_SEND]
  520. : ['order_ht_status_log.ORDER_STATUS' => OrderMain::ORDER_STATUS_WAITING_CONFIRM, 'order_ht_status_log.BEFORE_STATUS' => OrderMain::ORDER_STATUS_WAITING_SEND, 'order_ht_status_log.CREATE_USER_ID' => $params['send_user_id']];
  521. $query->andFilterWhere($send_where);
  522. } else {
  523. $query->andFilterWhere(['in', 'ORDER_STATUS', [198, 314, 147, 313, 382]]);
  524. }
  525. $hotel_id = $this->PARENT_PROD_ID;
  526. if ($hotel_id != 0) {
  527. $query->andFilterWhere([
  528. '=', 'PARENT_PROD_ID', $hotel_id,
  529. ]);
  530. }
  531. $date_type = $this->date_type;
  532. $query->addSelect(['(select count(*) from order_main where cancel_flag = 0 and order_prod_type = 26 and PARENT_ORDER_ID = t.order_id) as room_count']);
  533. /*if ($date_type == 2) {
  534. $query->addSelect(["(select count(*) from order_main where cancel_flag = 0 and order_prod_type = 26 and PROD_START_STATION_DATE between '{$this->start_date}' and '{$this->end_date}' and PARENT_ORDER_ID = t.order_id) as room_count"]);
  535. } else {
  536. $query->addSelect(['(select count(*) from order_main where cancel_flag = 0 and order_prod_type = 26 and PARENT_ORDER_ID = t.order_id) as room_count']);
  537. }*/
  538. if ($date_type == 1) {
  539. if ($this->start_date == $this->end_date)
  540. $query->andFilterWhere([
  541. 'like', 't.CREATE_TIME', $this->start_date,
  542. ]);
  543. else
  544. $query->andFilterWhere([
  545. 'between', 't.CREATE_TIME', $this->start_date . ' 00:00:00', $this->end_date . ' 23:59:59',
  546. ]);
  547. } elseif ($date_type == 2) {
  548. $query->andFilterWhere(['or', ['and', ['<=', 'prod_start_station_date', $this->start_date], ['>', 'prod_end_station_date', $this->start_date]],
  549. ['and', ['<=', 'prod_start_station_date', $this->end_date], ['>', 'prod_end_station_date', $this->end_date]],
  550. ['and', ['>=', 'prod_start_station_date', $this->start_date], ['<=', 'prod_end_station_date', $this->end_date]]]);
  551. } elseif ($date_type == 3) {
  552. if ($this->start_date == $this->end_date)
  553. $query->andFilterWhere([
  554. 'like', 'PROD_END_STATION_DATE', $this->start_date,
  555. ]);
  556. else
  557. $query->andFilterWhere([
  558. 'between', 'PROD_END_STATION_DATE', $this->start_date, $this->end_date,
  559. ]);
  560. }
  561. $query->groupBy('t.ORDER_ID');
  562. // 处理查询订单权限信息
  563. $order_where = $this->userRoleWhere('t');
  564. $query->andFilterWhere($order_where);
  565. //订单总数
  566. $totalCount = $query->count();
  567. $sql = $query->createCommand()->getRawSql();
  568. if (!in_array($op, ['cusServiceSend', 'cusService'])) {
  569. $report = new Report();
  570. $params['date_from'] = $params['start_date'];
  571. $params['date_to'] = $params['end_date'];
  572. $params['channel_id'] = $params['org_sale_id'];
  573. // 赔入赔出权限处理
  574. $compensate_where = $this->userRoleWhere('b');
  575. $sql_finance = $report->getCompensateInOrOut($params, $op)
  576. ->andFilterWhere($compensate_where)->createCommand()->getRawSql();
  577. $sql = "SELECT a.CREATE_TIME, a.CREATE_USER_ID, a.SALES_MAN, a.PRINCIPAL_ID, a.ORDER_ID, a.PARENT_PROD_ID, a.PROD_ID, a.CUSTOMER_NAME, a.CUSTOMER_MOBILE,
  578. a.PARENT_PROD_NAME, a.PROD_NAME, a.OUTSIDE_SALE_ORG_ID, a.PROD_START_STATION_DATE, a.PROD_END_STATION_DATE, a.ORDER_PRICE, a.BASE_PRICE, a.TOTAL_COMMISSION,
  579. a.PROFIT_VALUE, a.CHANNEL_NAME, a.INPUT_CREATE_USER, a.PURCHASE_TRUE_NAME, SUM(a.compensate_out) as compensate_out, SUM(a.compensate_in) as compensate_in, a.ORDER_STATUS_NAME,
  580. a.order_count, a.room_count
  581. FROM ({$sql} UNION {$sql_finance}, a.order_id) a GROUP BY ORDER_ID";
  582. }
  583. $dataProvider = new SqlDataProvider([
  584. 'sql' => 'SELECT b.* FROM(' . $sql . ') b',
  585. 'totalCount' => $totalCount,
  586. 'pagination' => [
  587. 'pageSize' => 15,
  588. ],
  589. ]);
  590. return $dataProvider;
  591. }
  592. /**
  593. * @Author wanglg
  594. * @Desc 报表统计查询权限条件
  595. * @param $alias查询条件关联别名设置
  596. */
  597. public function userRoleWhere($alias = '')
  598. {
  599. $alias = empty($alias) ? '' : $alias . '.';
  600. if (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_OPERATOR) {
  601. $where = [$alias . 'PRINCIPAL_ID' => Yii::$app->user->id];
  602. } elseif (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_PURCHASE) {
  603. $where = [$alias . 'SALES_MAN' => Yii::$app->user->id];
  604. } elseif (Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_ADMIN || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::HOTEL_CUS_ADMIN
  605. || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_ADMIN || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::SYS_CS
  606. || Yii::$app->user->identity['USER_ROLE'] == BaseUserAuth::FINANCIAL_OFFICER) {
  607. // 酒店管理员、客服管理人员、后台管理人员和系统管理员、财务人员可以查看所有数据
  608. $where = [];
  609. } else {
  610. $where = [$alias . 'ID' => -1];
  611. }
  612. return $where;
  613. }
  614. /**
  615. * @Author wanglg
  616. * @Desc 获取订单详情
  617. * @param $order_id
  618. * @return array
  619. */
  620. public function orderDetail($order_id)
  621. {
  622. $data = array();
  623. $data['data'] = OrderMain::find()
  624. ->select(['a.CREATE_USER_ID', 'a.ORDER_ID', 'a.ORDER_PRICE', 'a.ORDER_TITLE_ID', 'a.BASE_PRICE', 'a.TOTAL_COMMISSION', 'a.PROFIT_VALUE', 'a.RUN_DATE', 'a.OUTSIDE_SALE_ORG_ID',
  625. 'a.IF_LAST_PROD', 'a.ORDER_LEVEL', 'c.SUPPLIER_NAME as channel_name', 'b.type_name as order_status_name', 'a.ORDER_PAY_STATUS', 'a.DOCKING_TYPE', 'a.ORDER_STATUS', 'a.CHANNEL_ORDER_STATUS',
  626. 'd.type_name as docking_type_desc', 'IFNULL(e.type_name, "") channel_order_status_desc', 'h.base_room_type', 'a.ORDER_DESCRIPTION', 'a.PARENT_PROD_NAME', 'a.OUTSIDE_ORDER_NO',
  627. 'a.ORDER_CONFIRM_CODE', 'a.PARENT_ORDER_ID', 'a.PARENT_PROD_ID', 'PROD_ID', 'a.PROD_NAME', 'a.RUN_TIME', 'a.CUSTOMER_MEMO', 'a.CUSTOMER_NAME', 'a.CUSTOMER_MOBILE', 'a.CREATE_TIME', 'a.PROD_START_STATION_DATE', 'a.PROD_END_STATION_DATE',
  628. 'g.gathering_status', 'g.payment_status', 'ss.COMMISION_FLAG', 'ss.COMMISION_TYPE', 'ss.BACK_COMMISION_METHOD', 'ss.BACK_PERCENT', 'ss.BACK_VALUE', 'opera_hotel_room.ID as RoomId',
  629. 'pm.TRUE_NAME as PRINCIPAL_NAME'])
  630. ->joinWith('statusLabel b')
  631. ->joinWith('baseChannel c')
  632. ->joinWith('dockingType d')
  633. ->joinWith('channelOrderStatus e')
  634. ->joinWith('operaHotelRoom')
  635. ->joinWith('subRoom as h')
  636. ->joinWith('orderFinanceStatus g')
  637. ->joinWith('principalMan as pm')
  638. ->leftJoin('base_supplier_sale as ss', 'a.OUTSIDE_SALE_ORG_ID=ss.SUPPLIER_ID and ss.CANCEL_FLAG=0 and ss.PARENT_TYPE=25')
  639. ->where(['and', 'a.CANCEL_FLAG=0', 'a.ORDER_PROD_TYPE in (25, 26)', ['or', 'a.ORDER_ID=' . $order_id, 'a.PARENT_ORDER_ID=' . $order_id]])
  640. ->from('order_main a')
  641. ->asArray()->all();
  642. $data['order_comment'] = OrderComment::find()
  643. ->joinWith('user')
  644. ->where(['ORDER_ID' => $order_id, 'COMMENT_TYPE' => [0, 1], 'order_comment.CANCEL_FLAG' => 0])->asArray()->all();
  645. $data['hotel_child_order_detail'] = OrderMain::find()
  646. ->select(['PARENT_PROD_ID', 'COUNT(*) AS TOTAL', 'STOCK_TYPE', 'ORDER_ID', 'ORDER_DESCRIPTION', 'RUN_DATE', 'PARENT_ORDER_ID', 'PROD_ID', 'COUNT(*) * ORDER_PRICE AS ALL_PRICE', 'COUNT(*) * MID_PRICE as TOTAL_MID_PRICE',
  647. 'PROD_NAME', 'ORDER_PRICE', 'CONVERT(SUM(BASE_PRICE)/COUNT(*), DECIMAL(10, 2)) AS BASE_PRICE', 'CONVERT((ORDER_PRICE - SUM(BASE_PRICE)/COUNT(*) - MID_PRICE-TOTAL_COMMISSION) * COUNT(*), DECIMAL(10, 2)) AS BENEFIT',
  648. 'TOTAL_COMMISSION * COUNT(*) AS TOTAL_COMMISSION', 'RUN_TIME AS CHECKIN_TIME',
  649. 'ORDER_CONFIRM_CODE', 'OUTSIDE_SALE_ORG_ID', 'b.COMMISION_FLAG', 'b.BACK_COMMISION_TYPE', 'b.BACK_COMMISION_METHOD', 'b.BACK_PERCENT', 'b.BACK_VALUE'])
  650. ->leftJoin('base_supplier_sale as b', 'a.OUTSIDE_SALE_ORG_ID=b.SUPPLIER_ID and b.CANCEL_FLAG=0 and b.PARENT_TYPE=25')
  651. ->from('order_main a')
  652. ->where(['PARENT_ORDER_ID' => $order_id, 'a.CANCEL_FLAG' => 0, 'ORDER_PROD_TYPE' => [25, 26]])
  653. ->groupBy('RUN_DATE')
  654. // ->createCommand() ->getRawSql();
  655. ->asArray()->all();
  656. $data['hotel_order_detail'] = OrderMain::find()
  657. ->select(['order_status',
  658. 'order_description',
  659. 'outside_order_no',
  660. 'parent_prod_name as hotel_name',
  661. 'order_confirm_code',
  662. 'refuse_flag',
  663. 'prod_name as product_name',
  664. 'prod_start_station_date as start_date',
  665. 'prod_end_station_date as end_date',
  666. 'run_date',
  667. 'run_time as checkin_time',
  668. 'customer_memo',
  669. 'customer_name',
  670. 'customer_mobile',
  671. 'order_price',
  672. 'create_time',
  673. 'order_pay_time'])
  674. ->where(['and', 'cancel_flag=0', 'parent_order_id=0', 'order_prod_type IN (25, 26)', 'order_id=' . $order_id])
  675. // -> createCommand() -> getSql();
  676. ->asArray()->one();
  677. $data['hotel_child_order_detail'] = array_change_key_case($data['hotel_child_order_detail'], CASE_UPPER);
  678. $data['hotel_order_detail'] = array_change_key_case($data['hotel_child_order_detail'], CASE_UPPER);
  679. return $data;
  680. }
  681. // 查询主订单相关信息
  682. public function ordersInfo($order_id)
  683. {
  684. $query = OrderMain::find()
  685. ->where(['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $order_id, 'PARENT_ORDER_ID=' . $order_id]])
  686. ->all();
  687. return $query;
  688. }
  689. /**
  690. * User: wangxj
  691. * 酒店状态发生变化时,设置memcache,供酒店供应商提示获取缓存
  692. *
  693. * @param $order_id
  694. * @param $type
  695. */
  696. public static function setMemcache($order_id, $type, $prod_top_org_id, $prod_name, $expire = 0)
  697. {
  698. $cache = Yii::$app->cacheCS;
  699. $cache->encrypt = false;
  700. $newOrder = $cache->get('hotel_newOrder');
  701. $tmp = array();
  702. if ($order_id) {
  703. if ($newOrder && count($newOrder) > 0) {
  704. //按天为单位读取缓存
  705. if (isset($newOrder[$prod_top_org_id])) {
  706. array_push($newOrder[$prod_top_org_id], array('order_id' => $order_id, 'type' => $type, 'room_name' => $prod_name, 'status' => 0));
  707. } else {
  708. $newOrder[$prod_top_org_id] = array(array('order_id' => $order_id, 'type' => $type, 'room_name' => $prod_name, 'status' => 0));
  709. }
  710. $tmp = $newOrder;
  711. } else {
  712. $tmp[$prod_top_org_id] = array(array('order_id' => $order_id, 'type' => $type, 'room_name' => $prod_name, 'status' => 0));
  713. }
  714. $cache->set('hotel_newOrder', $tmp, 0, $expire);
  715. }
  716. }
  717. /**
  718. * User: wangxj
  719. * 取消单时,清除缓存中的订单
  720. *
  721. * @param $order_id
  722. */
  723. public function resetMem()
  724. {
  725. OrderMain::resetMemcache($this->ORDER_ID);
  726. }
  727. public static function resetMemcache($order_id)
  728. {
  729. $cache = Yii::$app->cacheCS;
  730. $cache->encrypt = false;
  731. $newOrder = $cache->get('hotel_newOrder');
  732. if ($newOrder && count($newOrder) > 0) {
  733. foreach ($newOrder as &$hotels) {
  734. if (count($hotels) > 0) {
  735. foreach ($hotels as $key => &$order) {
  736. if ($order['order_id'] == $order_id) {
  737. unset($hotels[$key]);
  738. $cache->set('hotel_newOrder', $newOrder);
  739. }
  740. }
  741. }
  742. }
  743. }
  744. }
  745. /**
  746. * User:Steven
  747. * Desc:有损取消没有地方记录,需要按照发单人统计订单,服务于客服的绩效分析
  748. */
  749. public function getTemOrder()
  750. {
  751. $sql = "SELECT count(c.order_id) AS count,d.USER_NAME,d.TRUE_NAME FROM (SELECT a.order_id,b.CREATE_USER_ID,b.ORDER_STATUS FROM order_main a LEFT JOIN order_ht_status_log b ON a.ORDER_ID=b.ORDER_ID AND b.ORDER_STATUS=198
  752. WHERE a.PARENT_ORDER_ID=0 AND a.CANCEL_FLAG=0 AND a.ORDER_VALID_STATUS=1 AND a.DOCKING_TYPE=556 AND a.CREATE_TIME BETWEEN '2017-06-01 00:00:00' AND '2017-06-30 00:00:00') AS c
  753. LEFT JOIN base_user d ON c.CREATE_USER_ID=d.ID AND d.CANCEL_FLAG=0
  754. WHERE c.ORDER_STATUS IS NOT NULL GROUP BY c.CREATE_USER_ID ORDER BY count;";
  755. $connection = Yii::$app->db;
  756. $res = $connection->createCommand($sql)->queryAll();
  757. return $res;
  758. }
  759. /**
  760. * Notes:接受渠道订单
  761. * User: Steven
  762. * Date: 2018/1/18
  763. * Time: 11:14
  764. * @return bool
  765. * @throws Exception
  766. */
  767. public function receiveChannel()
  768. {
  769. $tran = Yii::$app->db->beginTransaction();
  770. try {
  771. $count = OrderMain::updateAll([
  772. 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS,
  773. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  774. 'UPDATE_TIME' => date('Y-m-d H:i:s', time()),
  775. ],
  776. [
  777. 'CANCEL_FLAG' => 0,
  778. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  779. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  780. ]);
  781. //保存日志
  782. $this->saveLog('receive_channel', $this->getOldAttribute('ORDER_STATUS'));
  783. if (!$this->save() || $count <= 0) {
  784. throw new Exception('');
  785. }
  786. $tran->commit();
  787. return true;
  788. } catch (Exception $exception) {
  789. $tran->rollBack();
  790. return false;
  791. }
  792. }
  793. /**
  794. * Notes:拒绝渠道订单
  795. * User: Steven
  796. * Date: 2018/1/18
  797. * Time: 11:16
  798. * @param $flag
  799. * @return bool
  800. * @throws Exception
  801. */
  802. public function refuseChannel($flag)
  803. {
  804. $tran = Yii::$app->db->beginTransaction();
  805. try {
  806. $count = OrderMain::updateAll([
  807. 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS,
  808. 'ORDER_STATUS' => $this->ORDER_STATUS,
  809. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  810. 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS,
  811. 'UPDATE_TIME' => date('Y-m-d H:i:s', time()),
  812. ],
  813. [
  814. 'CANCEL_FLAG' => 0,
  815. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  816. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  817. ]);
  818. //保存日志
  819. $this->saveLog('refuse_channel', $this->getOldAttribute('ORDER_STATUS'));
  820. if ($flag) {
  821. $rs = $this->rollbackStocks();
  822. if (!$rs) {
  823. throw new Exception('');
  824. }
  825. }
  826. if (!$this->save() || $count <= 0) {
  827. throw new Exception('');
  828. }
  829. $tran->commit();
  830. return true;
  831. } catch (Exception $exception) {
  832. $tran->rollBack();
  833. return false;
  834. }
  835. }
  836. /**
  837. * Notes:酒店确认,输入确认号
  838. * User: Steven
  839. * Date: 2018/1/18
  840. * Time: 11:19
  841. * @return bool
  842. * @throws Exception
  843. */
  844. public function confirm()
  845. {
  846. $tran = Yii::$app->db->beginTransaction();
  847. try {
  848. $count = OrderMain::updateAll([
  849. 'ORDER_STATUS' => $this->ORDER_STATUS,
  850. 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS,
  851. 'ORDER_CONFIRM_CODE' => $this->ORDER_CONFIRM_CODE,
  852. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  853. 'ORDER_LEVEL' => $this->ORDER_LEVEL,
  854. 'UPDATE_TIME' => date('Y-m-d H:i:s', time()),
  855. ],
  856. [
  857. 'CANCEL_FLAG' => 0,
  858. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  859. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  860. ]);
  861. //保存日志
  862. $this->saveLog('confirm', $this->getOldAttribute('ORDER_STATUS'));
  863. if (!$this->save() || $count <= 0) {
  864. throw new Exception('');
  865. }
  866. $tran->commit();
  867. return true;
  868. } catch (Exception $exception) {
  869. $tran->rollBack();
  870. return false;
  871. }
  872. }
  873. /**
  874. * Notes:发单
  875. * User: Steven
  876. * Date: 2018/1/18
  877. * Time: 11:22
  878. * @return bool
  879. * @throws Exception
  880. */
  881. public function sendOrder()
  882. {
  883. $tran = Yii::$app->db->beginTransaction();
  884. try {
  885. //更新子订单
  886. $count = OrderMain::updateAll([
  887. 'ORDER_STATUS' => $this->ORDER_STATUS,
  888. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  889. 'ORDER_LEVEL' => $this->ORDER_LEVEL,
  890. 'UPDATE_TIME' => date('Y-m-d H:i:s', time())],
  891. [
  892. 'CANCEL_FLAG' => 0,
  893. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  894. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  895. ]);
  896. //保存日志 order_ht_status_log该表中订单的状态信息也在这这个方法里面处理
  897. $this->saveLog('send_order', $this->getOldAttribute('ORDER_STATUS'));
  898. if (!$this->save() || $count <= 0) {
  899. throw new Exception('');
  900. }
  901. $tran->commit();
  902. return true;
  903. } catch (Exception $exception) {
  904. $tran->rollBack();
  905. return false;
  906. }
  907. }
  908. /**
  909. * Notes:退改
  910. * User: Steven
  911. * Date: 2018/1/18
  912. * Time: 11:25
  913. * @param $msg
  914. * @return bool
  915. * @throws Exception
  916. */
  917. public function backChange($msg)
  918. {
  919. $tran = Yii::$app->db->beginTransaction();
  920. try {
  921. //更新子订单
  922. $count = OrderMain::updateAll([
  923. 'ORDER_STATUS' => $this->ORDER_STATUS,
  924. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  925. 'UPDATE_TIME' => date('Y-m-d H:i:s', time())],
  926. [
  927. 'CANCEL_FLAG' => 0,
  928. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  929. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  930. ]);
  931. //保存日志
  932. $this->saveLog('back-change', $this->getOldAttribute('ORDER_STATUS'), $msg);
  933. $order_apply_bounce = new OrderHtApplyBounce();
  934. $order_apply_bounce->ORDER_ID = $this->ORDER_ID;
  935. $order_apply_bounce->CREATE_USER_ID = Yii::$app->user->id;
  936. $order_apply_bounce->UPDATE_USER_ID = Yii::$app->user->id;
  937. $order_apply_bounce->REASON = $msg;
  938. $order_apply_bounce->CREATE_TIME = date('Y-m-d H:i:s', time());
  939. $order_apply_bounce->UPDATE_TIME = date('Y-m-d H:i:s', time());
  940. if (!$this->save() || $count <= 0 || !$order_apply_bounce->save()) {
  941. throw new Exception('');
  942. }
  943. $tran->commit();
  944. return true;
  945. } catch (Exception $exception) {
  946. $tran->rollBack();
  947. return false;
  948. }
  949. }
  950. /**
  951. * Notes:向酒店供应商申请退单
  952. * User: Steven
  953. * Date: 2018/1/3
  954. * Time: 16:31
  955. * @return bool
  956. * @throws Exception
  957. */
  958. public function cancelConfirming()
  959. {
  960. $tran = Yii::$app->db->beginTransaction();
  961. try {
  962. //更新子订单
  963. $count = OrderMain::updateAll([
  964. 'ORDER_STATUS' => $this->ORDER_STATUS,
  965. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  966. 'UPDATE_TIME' => date('Y-m-d H:i:s', time())],
  967. [
  968. 'CANCEL_FLAG' => 0,
  969. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  970. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  971. ]);
  972. //保存日志
  973. $this->saveLog('cancel-confirming', $this->getOldAttribute('ORDER_STATUS'));
  974. if (!$this->save() || $count <= 0) {
  975. throw new Exception('');
  976. }
  977. $tran->commit();
  978. return true;
  979. } catch (Exception $exception) {
  980. $tran->rollBack();
  981. return false;
  982. }
  983. }
  984. /**
  985. * Notes:同意退单
  986. * User: Steven
  987. * Date: 2018/1/18
  988. * Time: 11:33
  989. * @param bool $type
  990. * @param $action
  991. * @return bool
  992. * @throws Exception
  993. */
  994. public function agreeCancel($type = true, $action)
  995. {
  996. $tran = Yii::$app->db->beginTransaction();
  997. try {
  998. //更新子订单
  999. $count = OrderMain::updateAll([
  1000. 'ORDER_STATUS' => $this->ORDER_STATUS,
  1001. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  1002. 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS,
  1003. 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS,
  1004. 'ORDER_LEVEL' => $this->ORDER_LEVEL,
  1005. 'UPDATE_TIME' => date('Y-m-d H:i:s', time()),
  1006. ],
  1007. [
  1008. 'CANCEL_FLAG' => 0,
  1009. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  1010. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  1011. ]);
  1012. //回退库存
  1013. $rs = $this->rollbackStocks();
  1014. //保存日志
  1015. $this->saveLog($action, $this->getOldAttribute('ORDER_STATUS'));
  1016. if (!$this->save() || $count <= 0 || !$rs) {
  1017. throw new Exception('');
  1018. }
  1019. $tran->commit();
  1020. return true;
  1021. } catch (Exception $exception) {
  1022. $tran->rollBack();
  1023. return false;
  1024. }
  1025. }
  1026. /**
  1027. * Notes:拒绝退单
  1028. * User: Steven
  1029. * Date: 2018/1/18
  1030. * Time: 11:41
  1031. * @return bool
  1032. * @throws Exception
  1033. */
  1034. public function refuseCancel()
  1035. {
  1036. /*if (Yii::$app->db->transaction)
  1037. $commitFlag = false;
  1038. else {
  1039. $commitFlag = true;
  1040. $tran = Yii::$app->db->beginTransaction();
  1041. }*/
  1042. $tran = Yii::$app->db->beginTransaction();
  1043. try {
  1044. //更新子订单
  1045. $count = OrderMain::updateAll([
  1046. 'ORDER_STATUS' => $this->ORDER_STATUS,
  1047. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  1048. 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS,
  1049. 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS,
  1050. 'ORDER_LEVEL' => $this->ORDER_LEVEL,
  1051. 'UPDATE_TIME' => date('Y-m-d H:i:s', time()),
  1052. ],
  1053. [
  1054. 'CANCEL_FLAG' => 0,
  1055. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  1056. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  1057. ]);
  1058. //保存日志
  1059. $this->saveLog('refuse-cancel', $this->getOldAttribute('ORDER_STATUS'));
  1060. if (!$this->save() || $count <= 0) {
  1061. throw new Exception('');
  1062. }
  1063. $tran->commit();
  1064. return true;
  1065. } catch (Exception $exception) {
  1066. $tran->rollBack();
  1067. return false;
  1068. }
  1069. }
  1070. /**
  1071. * Notes:取消退改
  1072. * User: Steven
  1073. * Date: 2018/1/3
  1074. * Time: 16:13
  1075. * @return bool
  1076. * @throws Exception
  1077. */
  1078. public function cancelBackChange()
  1079. {
  1080. $tran = Yii::$app->db->beginTransaction();
  1081. try {
  1082. //更新子订单
  1083. $count = OrderMain::updateAll([
  1084. 'ORDER_STATUS' => $this->ORDER_STATUS,
  1085. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  1086. 'UPDATE_TIME' => date('Y-m-d H:i:s', time())],
  1087. [
  1088. 'CANCEL_FLAG' => 0,
  1089. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  1090. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  1091. ]);
  1092. //保存日志
  1093. $this->saveLog('cancel_back_change', $this->getOldAttribute('ORDER_STATUS'));
  1094. if (!$this->save() || $count <= 0) {
  1095. throw new Exception('');
  1096. }
  1097. $tran->commit();
  1098. return true;
  1099. } catch (Exception $exception) {
  1100. $tran->rollBack();
  1101. return false;
  1102. }
  1103. }
  1104. /**
  1105. * Notes:取消订单
  1106. * User: Steven
  1107. * Date: 2018/1/4
  1108. * Time: 19:04
  1109. * @param $reason
  1110. * @return bool
  1111. * @throws Exception
  1112. */
  1113. public function cancelOrder($reason = '')
  1114. {
  1115. $tran = Yii::$app->db->beginTransaction();
  1116. try {
  1117. #region 1、更新子订单
  1118. $count = OrderMain::updateAll([
  1119. 'ORDER_STATUS' => $this->ORDER_STATUS,
  1120. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  1121. 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS,
  1122. 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS,
  1123. 'ORDER_LEVEL' => $this->ORDER_LEVEL,
  1124. 'UPDATE_TIME' => date('Y-m-d H:i:s', time()),
  1125. ],
  1126. [
  1127. 'CANCEL_FLAG' => 0,
  1128. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  1129. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  1130. ]);
  1131. #endregion
  1132. //回退库存
  1133. $resRollback = $this->rollbackStocks();
  1134. if (!$this->save() || !$resRollback || $count < 0) {
  1135. throw new Exception('取消失败');
  1136. }
  1137. $this->saveLog('cancel_order', $this->getOldAttribute('ORDER_STATUS'));
  1138. $tran->commit();
  1139. // 下单渠道供应商预付款处理及房态推送处理
  1140. $room_info = OperaHotelRoom::findOne(['HOTEL_ID' => $this->PARENT_PROD_ID, 'CANCEL_FLAG' => 0, 'ROOM_TYPE' => $this->PROD_ID]);
  1141. $soap_param = array('hotel_id' => $this->PARENT_PROD_ID, 'parent_room_type' => $room_info->PARENT_ROOM_TYPE, 'room_type' => $this->PROD_ID,
  1142. 'begin_date' => $this->PROD_START_STATION_DATE, 'end_date' => $this->PROD_END_STATION_DATE, 'channel_id' => $this->OUTSIDE_SALE_ORG_ID);
  1143. zHttp::syncRequest(CommonOrder::SEND_REQUEST_GET, Yii::$app->params['prepay_interface'], array('type' => CommonOrder::CANCEL_ORDER_DEDUCTION_TYPE, 'order_id' => $this->ORDER_ID));
  1144. zHttp::syncRequest(CommonOrder::SEND_REQUEST_GET, Yii::$app->params['push_info_interface'], array('param' => $soap_param));
  1145. } catch (\Exception $e) {
  1146. $error = $e->getMessage();
  1147. $arr = array(
  1148. "agentid" => 1000002,
  1149. "title" => '订单取消失败:',
  1150. "msg" => "订单取消失败\n订单号:" . $this->ORDER_ID . "\n失败原因:" . $error,
  1151. "touser" => $this->sendUser);
  1152. zOfficeWechat::sendMsg($arr);
  1153. $tran->rollBack();
  1154. return false;
  1155. }
  1156. return true;
  1157. }
  1158. /**
  1159. * Notes: 供应商拒单,输入拒单原因
  1160. * User: Steven
  1161. * Date: 2018/1/18
  1162. * Time: 11:49
  1163. * @param $msg
  1164. * @param string $type
  1165. * @return bool
  1166. * @throws Exception
  1167. */
  1168. public function refuse($msg, $type = 'refuse')
  1169. {
  1170. $tran = Yii::$app->db->beginTransaction();
  1171. try {
  1172. $count = OrderMain::updateAll([
  1173. 'ORDER_STATUS' => $this->ORDER_STATUS,
  1174. 'CHANNEL_ORDER_STATUS' => $this->CHANNEL_ORDER_STATUS,
  1175. 'UPDATE_USER_ID' => $this->UPDATE_USER_ID,
  1176. 'ORDER_LEVEL' => $this->ORDER_LEVEL,
  1177. 'ORDER_VALID_STATUS' => $this->ORDER_VALID_STATUS,
  1178. 'UPDATE_TIME' => date('Y-m-d H:i:s', time()),
  1179. ],
  1180. [
  1181. 'CANCEL_FLAG' => 0,
  1182. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  1183. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  1184. ]);
  1185. //回退库存
  1186. $rollback = $this->rollbackStocks();
  1187. //保存日志
  1188. $this->saveLog($type, $this->getOldAttribute('ORDER_STATUS'), $msg);
  1189. if (!$this->save() || $count <= 0 || !$rollback) {
  1190. throw new Exception('');
  1191. }
  1192. $tran->commit();
  1193. return true;
  1194. } catch (Exception $exception) {
  1195. $tran->rollBack();
  1196. return false;
  1197. }
  1198. }
  1199. /**
  1200. * 添加备注
  1201. */
  1202. public function addNote()
  1203. {
  1204. }
  1205. /**
  1206. * 保存日志
  1207. *
  1208. * @param $type string 类型
  1209. * @param $status_flag mixed 为false时,不需要保存订单状态日志,否则将 $status_flag作为订单原状态
  1210. */
  1211. public function saveLog($type, $status_flag = false, $msg = '')
  1212. {
  1213. //写订单日志、状态日志
  1214. //订单表没有基础房型id,需要查一下
  1215. $baseRoom = OperaHotelRoom::findOne(['CANCEL_FLAG' => 0, 'HOTEL_ID' => $this->PARENT_PROD_ID, 'ROOM_TYPE' => $this->PROD_ID]);
  1216. $orderLog = new OperaHotelLog();
  1217. $orderLog->CREATE_USER_ID = Yii::$app->user->id;
  1218. $orderLog->HOTEL_ID = $this->PARENT_PROD_ID;
  1219. $orderLog->LOG_TYPE = OperaHotelLog::LOG_TYPE_ORDER;
  1220. $orderLog->ROOM_TYPE = $this->PROD_ID;
  1221. $orderLog->PARENT_ROOM_TYPE = $baseRoom->PARENT_ROOM_TYPE;
  1222. switch ($type) {
  1223. case 'receive_channel':
  1224. $orderLog->LOG_DESC = "接受渠道订单:" . $this->ORDER_ID;
  1225. break;
  1226. case 'refuse_channel':
  1227. $orderLog->LOG_DESC = "拒绝渠道订单:" . $this->ORDER_ID;
  1228. break;
  1229. case 'refuse':
  1230. $orderLog->LOG_DESC = "拒绝了订单:" . $this->ORDER_ID . "(原因:" . $msg . ")";
  1231. break;
  1232. case 'confirm':
  1233. $orderLog->LOG_DESC = "确认订单:" . $this->ORDER_ID . "(确认号:" . $this->ORDER_CONFIRM_CODE . ")";
  1234. break;
  1235. case 'note':
  1236. $orderLog->LOG_DESC = $msg;
  1237. break;
  1238. case 'cancel_confirm':
  1239. $orderLog->LOG_DESC = "供应商确认退单,订单号为:" . $this->ORDER_ID;
  1240. break;
  1241. case 'cancel_reject':
  1242. $orderLog->LOG_DESC = "供应商拒绝退单,订单号为:" . $this->ORDER_ID;
  1243. break;
  1244. case 'send_order': //发单
  1245. $orderLog->LOG_DESC = "订单号为:" . $this->ORDER_ID . '的状态由待发单变为待确认';
  1246. break;
  1247. case 'cancel_order': //取消单
  1248. $orderLog->LOG_DESC = "取消订单,订单号为:" . $this->ORDER_ID;
  1249. break;
  1250. case 'back-change': //退改
  1251. $orderLog->LOG_DESC = "发起退改,退改原因:" . $msg;
  1252. break;
  1253. case 'cancel-confirming': //申请退单
  1254. $orderLog->LOG_DESC = "向供应商申请退单";
  1255. break;
  1256. case 'cancel_back_change': //申请退单
  1257. $orderLog->LOG_DESC = "取消退改";
  1258. break;
  1259. case 'agree-cancel': //申请退单
  1260. $orderLog->LOG_DESC = "同意退单,订单已取消";
  1261. break;
  1262. case 'refuse-cancel': //申请退单
  1263. $orderLog->LOG_DESC = "拒绝退单";
  1264. break;
  1265. case 'exception-order': //申请退单
  1266. $orderLog->LOG_DESC = "直连失败订单,直连状态由录单变为直连,订单号:" . $this->ORDER_ID . ",渠道单号:" . $this->OUTSIDE_ORDER_NO;
  1267. break;
  1268. case 'update_confirm': //申请退单
  1269. $orderLog->LOG_DESC = "将确认号(" . $this->ORDER_CONFIRM_CODE . ")修改为:" . $msg;
  1270. break;
  1271. case 'add_white_list': //添加白名单
  1272. $orderLog->LOG_DESC = "添加白名单订单号:" . $this->ORDER_ID . ',白名单类型:' . $msg;
  1273. break;
  1274. case 'send_email_success':
  1275. $orderLog->LOG_DESC = "通过邮件形式发送订单信息到酒店,邮件发送成功,收件人:" . $msg;
  1276. break;
  1277. case 'send_email_error':
  1278. $orderLog->LOG_DESC = "通过邮件形式发送订单信息到酒店,邮件发送失败,收件人:" . $msg;
  1279. break;
  1280. default:
  1281. $orderLog->LOG_DESC = '';
  1282. }
  1283. $orderLog->ORDER_ID = $this->ORDER_ID;
  1284. $orderLog->save();
  1285. if ($status_flag) {
  1286. $statusLog = new OrderHtStatusLog();
  1287. $statusLog->CREATE_USER_ID = Yii::$app->user->id;
  1288. $statusLog->UPDATE_USER_ID = Yii::$app->user->id;
  1289. $statusLog->BEFORE_STATUS = $status_flag;
  1290. $statusLog->ORDER_STATUS = $this->ORDER_STATUS;
  1291. $statusLog->ORDER_ID = $this->ORDER_ID;
  1292. $statusLog->save();
  1293. }
  1294. }
  1295. /**
  1296. * 下载确认修改单的word
  1297. */
  1298. public function wordHtml($down_type)
  1299. {
  1300. $user_id = Yii::$app->user->id;
  1301. $order_id = $this->ORDER_ID;
  1302. $type = OrderMain::order_level_array[$this->ORDER_LEVEL];
  1303. $confirm_org = OperaHotel::find()->joinWith('confirmOrganization')->where(['HOTEL_ID' => $this->PARENT_PROD_ID])->one();
  1304. $confirm_org_full_name = $confirm_org->confirmOrganization->ORG_NAME;
  1305. $hotel_name = $confirm_org->HOTEL_NAME;
  1306. $product_name = $this->PROD_NAME;
  1307. $customer_name = $this->CUSTOMER_NAME;
  1308. $base_price = $this->BASE_PRICE;
  1309. $customer_mobile = $this->CUSTOMER_MOBILE;
  1310. $date_check_in = $this->PROD_START_STATION_DATE;
  1311. $date_check_out = $this->PROD_END_STATION_DATE;
  1312. $confirm_code = $this->ORDER_CONFIRM_CODE;
  1313. //从日志查询最后一次确认人 cs系统导出不需要确认人信息,确认人信息通过邮件确认
  1314. $confirm_user = '';
  1315. if ($down_type) {
  1316. $log = OrderHtStatusLog::find()->joinWith('user')->where([OrderHtStatusLog::tableName() . '.CANCEL_FLAG' => 0,
  1317. 'ORDER_ID' => $order_id, 'ORDER_STATUS' => OrderMain::ORDER_STATUS_CONFIRMED])
  1318. ->orderBy([OrderHtStatusLog::tableName() . '.CREATE_TIME' => SORT_DESC])->one();
  1319. $confirm_user = $log->user->TRUE_NAME;
  1320. }
  1321. //备注
  1322. $notes = OrderComment::findAll(['ORDER_ID' => $order_id, 'CANCEL_FLAG' => 0, 'COMMENT_TYPE' => OrderComment::TYPE_PUBLIC]);
  1323. $customer_memo = '';
  1324. if (!empty($notes)) {
  1325. foreach ($notes as $note) {
  1326. $customer_memo .= $note->COMMENT_TXT . '<br />';
  1327. }
  1328. $customer_memo = substr($customer_memo, 0, -6);
  1329. }
  1330. $confirm_org_id = $confirm_org->CONFIRM_FROM;
  1331. if ($confirm_org_id == 1) {
  1332. $head_org_name = "上海南顺";
  1333. } elseif ($confirm_org_id == 2) {
  1334. $head_org_name = '上海蜘蛛行';
  1335. } elseif ($confirm_org_id == 3) {
  1336. $head_org_name = '上海自在';
  1337. } elseif ($confirm_org_id == 4) {
  1338. $head_org_name = '杭州启程';
  1339. } elseif ($confirm_org_id == 5) {
  1340. $head_org_name = '杭州倒计时';
  1341. } elseif ($confirm_org_id == 6) {
  1342. $head_org_name = '千旅集散';
  1343. }elseif ($confirm_org_id == 7) {
  1344. $head_org_name = '昆山文商旅';
  1345. } else {
  1346. $head_org_name = '上海蜘蛛行';
  1347. }
  1348. //供应商
  1349. $supplier = BaseSupplier::find()->joinWith('settleType')->joinWith('settleCycle')->where(['base_supplier.ID' => $confirm_org->SUPPLIER_ID])->one();
  1350. $payType = $supplier->settleType->TYPE_NAME;
  1351. $paySeq = $supplier->settleCycle->TYPE_NAME;
  1352. $phpWord = new zPhpWord();
  1353. //入住详情
  1354. $mes = '';
  1355. $total_price = 0;
  1356. $messageHeight = 70;
  1357. $sub_orders = OrderMain::find()
  1358. ->addSelect([
  1359. '*',
  1360. 'count(*) as order_count',
  1361. 'sum(base_price) as order_price',
  1362. ])->asArray()->where(['PARENT_ORDER_ID' => $order_id, 'CANCEL_FLAG' => 0])->groupBy(['PROD_START_STATION_DATE', 'STOCK_TYPE'])->all();
  1363. if (!empty($sub_orders)) {
  1364. foreach ($sub_orders as $v) {
  1365. $mes .= "<div>" . $v['PROD_START_STATION_DATE'] . ' ' . ' ' . '结算价:' . $v['BASE_PRICE'] . '元/间' . ' 数量:' . $v['order_count'] . '间 ' .
  1366. (in_array($v['PARENT_PROD_ID'], [81, 23]) ? ($v['STOCK_TYPE'] == 228 ? '买断房价格' : '其他价格') : '') . "</div>";
  1367. $total_price += $v['BASE_PRICE'] * $v['order_count'];
  1368. $messageHeight += 30;
  1369. }
  1370. }
  1371. $messageHeight .= 'px';
  1372. $message = $mes . '订单总计:' . $total_price . '元';
  1373. //当前操作人及时间
  1374. /* @var $login_user User */
  1375. $login_user = Yii::$app->user->identity;
  1376. $action_user_name = $login_user->TRUE_NAME;
  1377. // $action_date = date('Y-m-d H:i');
  1378. $action_date = date('Y-m-d');
  1379. return <<< WORD
  1380. <!DOCTYPE html>
  1381. <html lang="en">
  1382. <head>
  1383. <meta charset="UTF - 8">
  1384. <title>{$type}</title>
  1385. </head>
  1386. <style>
  1387. td {
  1388. padding: 6px; height: 45px;
  1389. }
  1390. </style>
  1391. <body style="margin: 0 auto;width: 800px;font-family: 宋体">
  1392. <div>
  1393. <!--头部-->
  1394. <div style="width: 100%;text-align: center;margin-top: 15px;">
  1395. <span style="font-family: 宋体;font-size: 42px;font-weight: 600;">{$head_org_name}{$type}</span></div>
  1396. </div>
  1397. <!--body部-->
  1398. <div style="margin-top: 30px;">
  1399. <table border="2" cellpadding="0" cellspacing="0"
  1400. style="width: 100%;height: 100%; border-color: #a9c6c9;border-collapse: collapse;">
  1401. <tr>
  1402. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">订单号:</th>
  1403. <td style="padding: 4px; height: 45px;font-size: 16px;text-align: center;">{$order_id}</td>
  1404. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">付款方式:</th>
  1405. <td style="padding: 4px; height: 45px;font-size: 16px;text-align: center;">{$payType}&nbsp;{$paySeq}</td>
  1406. </tr>
  1407. <tr>
  1408. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">发 自:</th>
  1409. <td colspan="3" style="padding: 4px; height: 45px;font-size: 16px;text-align: center;font-weight: 600;">{$confirm_org_full_name}</td>
  1410. </tr>
  1411. <tr>
  1412. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">传 真:</th>
  1413. <td style="padding: 4px; height: 45px;font-size: 16px;text-align: center;">0571-86697329</td>
  1414. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">电 话:</th>
  1415. <td style="padding: 4px; height: 45px;font-size: 16px;text-align: center;">0571-86699832</td>
  1416. </tr>
  1417. </table>
  1418. <div style='height: 60px;'>&nbsp;</div>
  1419. <table border="2" cellpadding="0" cellspacing="0"
  1420. style="width: 100%;height: 100%; border-color: #a9c6c9;border-collapse: collapse;">
  1421. <tr >
  1422. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">预订房型:</th>
  1423. <td colspan="3" style="padding: 4px; height: 45px;font-size: 16px;text-align: center;font-weight: 600;">{$hotel_name} {$product_name}</td>
  1424. </tr>
  1425. <tr>
  1426. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">客人姓名:</th>
  1427. <td colspan="3" style="padding: 4px; height: 45px;font-size: 16px;text-align: center;">{$customer_name}</td>
  1428. </tr>
  1429. <tr>
  1430. <th style="padding: 4px; height: 50px;font-size: 16px;width: 120px;">结算总价:</th>
  1431. <td colspan="3" style="padding: 4px; height: 50px;font-size: 16px;text-align: center;">&nbsp;{$base_price}元</td>
  1432. </tr>
  1433. <tr>
  1434. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">入住日期:</th>
  1435. <td style="padding: 4px; height: 45px;font-size: 16px;font-weight: 600;">&nbsp;{$date_check_in}</td>
  1436. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">离店日期:</th>
  1437. <td style="padding: 4px; height: 45px;font-size: 16px;font-weight: 600;">&nbsp;{$date_check_out}</td>
  1438. </tr>
  1439. <tr style="height: 70px;">
  1440. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">备 注:</th>
  1441. <td colspan="3" style="padding: 4px; height: 45px;font-size: 16px;text-align: center;">{$customer_memo}</td>
  1442. </tr>
  1443. <tr>
  1444. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">酒店确认号:</th>
  1445. <td style="padding: 4px; height: 45px;font-size: 16px;">&nbsp;{$confirm_code}</td>
  1446. <th style="padding: 4px; height: 45px;font-size: 16px;width: 120px;">确认人:</th>
  1447. <td style="padding: 4px; height: 45px;font-size: 16px;">$confirm_user</td>
  1448. </tr>
  1449. <tr style="height: {$messageHeight};">
  1450. <td colspan="4" style="line-height: 20px; font-size: 16px;padding-left: 20px; padding-right: 20px;word-break:break-all">{$message}</td>
  1451. </tr>
  1452. </table>
  1453. <div style="height:50px;padding: 20px;float: right;text-align: right;"><br>
  1454. <table>
  1455. <tr >
  1456. <td style="width: 50%;"></td>
  1457. <td style="font-size: 16px;font-weight: 600;">操作人:</td><td style="font-size: 16px;">{$action_user_name}</td>
  1458. </tr>
  1459. <tr >
  1460. <td style="width: 50%"></td>
  1461. <td style="font-weight: 600;font-size: 16px;">操作日期:</td><td style="font-size: 16px;">{$action_date}</td>
  1462. </tr>
  1463. </table>
  1464. <!-- <span style="font-weight: 600;font-size: 13px;">操 作 人:</span><span style="font-size: 13px;">王海顺</span><br><br>
  1465. <span style="font-weight: 600;margin-top: 5px;font-size: 13px;">操作日期12:</span><span style="font-size: 13px;">2016-12-12</span>-->
  1466. </div>
  1467. </div>
  1468. <div style="padding: 20px;width:800px;text-align: center;margin-top: 55px;">
  1469. <span style="font-size: 12px;color: darkgray">* {$confirm_org_full_name} 电话:021-33280578 传真:021-33280184</span>
  1470. </div>
  1471. </div>
  1472. </div>
  1473. </body>
  1474. </html>
  1475. WORD;
  1476. }
  1477. /*
  1478. * 酒店供应商导出订单列表所需的列表头
  1479. */
  1480. public static function supplierExportAttributes()
  1481. {
  1482. return [
  1483. 'ORDER_ID',
  1484. 'CREATE_TIME',
  1485. 'PARENT_PROD_NAME',
  1486. 'PROD_NAME',
  1487. 'PROD_START_STATION_DATE',
  1488. 'PROD_END_STATION_DATE',
  1489. 'room_count',
  1490. 'CUSTOMER_NAME',
  1491. 'CUSTOMER_MOBILE',
  1492. 'BASE_PRICE',
  1493. 'ORDER_STATUS',
  1494. 'CUSTOMER_MEMO',
  1495. ];
  1496. }
  1497. /**
  1498. * Notes:新的退单逻辑
  1499. * 该接口没有关于订单的更新,需要在该接口外做处理
  1500. * User: Steven
  1501. * Date: 2018/1/4
  1502. * Time: 18:38
  1503. * @return bool
  1504. */
  1505. public function rollbackStocks()
  1506. {
  1507. //查询子订单
  1508. $orders = OrderMain::findAll([
  1509. 'CANCEL_FLAG' => 0,
  1510. 'PARENT_ORDER_ID' => $this->ORDER_ID,
  1511. 'ORDER_PROD_TYPE' => self::ORDER_PROD_TYPE_SUM,
  1512. 'OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID,
  1513. ]);
  1514. $room_distrib = OperaRoomDistrib::findOne([
  1515. 'ROOM_ID' => $this->RUN_ID,
  1516. 'DISTRIB_ID' => $this->OUTSIDE_SALE_ORG_ID,
  1517. 'CANCEL_FLAG' => 0,
  1518. ]);
  1519. foreach ($orders as $order) {
  1520. //渠道已售数量要减去
  1521. $distrib = RunHotelDistrib::findOne([
  1522. 'HOTEL_ID' => $order->PARENT_PROD_ID,
  1523. 'ROOM_TYPE' => $order->PROD_ID,
  1524. 'RUN_DATE' => $order->RUN_DATE,
  1525. 'DISTRIB_ID' => $order->OUTSIDE_SALE_ORG_ID,
  1526. ]);
  1527. $distrib->SALED_COUNT == 0 ? true : $distrib->SALED_COUNT -= 1;
  1528. $runHotel = RunHotel::findOne([
  1529. 'HOTEL_ID' => $order->PARENT_PROD_ID,
  1530. 'BASE_ROOM_TYPE' => $distrib->BASE_ROOM_TYPE, //订单表没有这字段,但是run_hotel_distrib有
  1531. 'RUN_DATE' => $order->RUN_DATE,
  1532. 'STOCK_TYPE' => $order->STOCK_TYPE,
  1533. ]);
  1534. if ($order->RUN_BUS_SEAT_TYPE == self::DISTRIB_STOCK_TYPE_RESERVE) { //消耗渠道的库存类型:1:固定数量
  1535. //这里需要处理:当当前房型、当前渠道设置了保留房的失效时间,如果当前时间属于失效时间范围内,则渠道库存不退回,基础房型中的保留房库存不回退,但买断房库存需要回退
  1536. if (!empty($room_distrib['LATEST_COMFIRM_TIME']) && $room_distrib['LATEST_COMFIRM_TIME'] != -1) { //说明有保留房的最晚立即确认时间
  1537. $time_arr = explode(',', $room_distrib['LATEST_COMFIRM_TIME']);
  1538. $date = date('Y-m-d', strtotime($order->RUN_DATE . "-{$time_arr[0]} day"));
  1539. $latest_confirm_time = $date . ' ' . $time_arr[1];//该子房型在$order->RUN_DATE这一天看来,保留房失效的时间起点
  1540. if (time() >= strtotime($latest_confirm_time)) { //如果这个日期消耗的库存是保留房,那么这个日期改保留房已经过期 渠道固定数量不退回,基础房型如果消耗的是保留房,也不退回
  1541. if ($order->STOCK_TYPE != self::STOCK_TYPE_RESERVE) { //消耗的基础房型的库存不是保留 要回退 但是,如果是保留的话,不回退
  1542. $runHotel->REMAINING_COUNT += 1;
  1543. $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1;
  1544. // $distrib->REMAINING_COUNT += 1;
  1545. } else { //消耗的是保留 不回退
  1546. $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1;
  1547. }
  1548. } else { //保留房库存没有过期 所有库存照常回退
  1549. $runHotel->REMAINING_COUNT += 1;
  1550. $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1;
  1551. $distrib->REMAINING_COUNT += 1;
  1552. }
  1553. } else { //没有设置保留房失效时间 所有库存照常回退
  1554. $runHotel->REMAINING_COUNT += 1;
  1555. $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1;
  1556. $distrib->REMAINING_COUNT += 1;
  1557. }
  1558. } else { //消耗的是渠道的超卖 即没有保留房,也即没有保留房失效时间之说
  1559. $runHotel->REMAINING_COUNT += 1;
  1560. $runHotel->SALED_COUNT == 0 ? true : $runHotel->SALED_COUNT -= 1;
  1561. }
  1562. $resRunHotel = $runHotel->save();
  1563. $resDistrib = $distrib->save();
  1564. if (!$resRunHotel || !$resDistrib) {
  1565. return false;
  1566. }
  1567. }
  1568. return true;
  1569. }
  1570. /**
  1571. * @Author wanglg
  1572. * @Desc 获取库存记录,用于修改入住需求的库存合并
  1573. * @param $params
  1574. */
  1575. public function getStockArr($params)
  1576. {
  1577. $orders = OrderMain::findAll(['PRRENT_ORDER_ID' => $params['order_id'], 'CANCEL_FLAG' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_SUM,
  1578. 'OUTSIDE_SALE_ORG_ID' => $params['DistribID']]);
  1579. $room_distrib = OperaRoomDistrib::findOne([
  1580. 'ROOM_ID' => $params['RoomId'],
  1581. 'DISTRIB_ID' => $params['DistribID'],
  1582. 'CANCEL_FLAG' => 0,
  1583. ]);
  1584. OperaHotelRoom::find()
  1585. ->joinWith('runHotel b')
  1586. ->where(['a.ID' => $params['RoomID'], 'a.CANCEL_FLAG' => 0,])
  1587. ->from('opera_hotel_room a');
  1588. foreach ($orders as $order) {
  1589. $old_stock = OperaHotelRoom::find()
  1590. ->joinWith('runHotel b')
  1591. ->where(['a.ID' => $params['RoomID'], 'a.CANCEL_FLAG' => 0, 'b.RUN_DATE' => $order->RUN_DATE, 'b.STOCK_TYPE' => $order->STOCK_TYPE])
  1592. ->from('opera_hotel_room a')
  1593. ->asArray()->one();
  1594. }
  1595. }
  1596. /**
  1597. * 回退库存
  1598. * 正常取消(包括拒单),库存和已售数均回退
  1599. * 异常取消,已售数均回退,基础房型各项数据均回退,渠道固定数量不回退
  1600. *
  1601. * @param bool $type 是否为正常取消
  1602. * @return bool
  1603. */
  1604. public function rollbackStock($type = true)
  1605. {
  1606. $logger = new TopLogger();
  1607. $orders = OrderMain::findAll(['CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $this->ORDER_ID]);
  1608. foreach ($orders as $order) {
  1609. $distrib = RunHotelDistrib::findOne([
  1610. 'HOTEL_ID' => $order->PARENT_PROD_ID,
  1611. 'ROOM_TYPE' => $order->PROD_ID,
  1612. 'RUN_DATE' => $order->RUN_DATE,
  1613. 'DISTRIB_ID' => $order->OUTSIDE_SALE_ORG_ID,
  1614. ]);
  1615. $distrib->SALED_COUNT -= 1;
  1616. $runHotel = RunHotel::findOne([
  1617. 'HOTEL_ID' => $order->PARENT_PROD_ID,
  1618. 'BASE_ROOM_TYPE' => $distrib->BASE_ROOM_TYPE, //订单表没有这字段,但是run_hotel_distrib有
  1619. 'RUN_DATE' => $order->RUN_DATE,
  1620. 'STOCK_TYPE' => $order->STOCK_TYPE,
  1621. ]);
  1622. $logger->log([date("Y-m-d H:i:s"), '回退库存:' . $distrib->SALED_COUNT . ', 订单信息:' . $this->ORDER_ID . ',剩余库存数量:' . $runHotel->REMAINING_COUNT . PHP_EOL], 'ali/error');
  1623. // if ($order->STOCK_TYPE != OrderMain::STOCK_TYPE_INQUIRY) {
  1624. if ($type) {
  1625. $distrib->REMAINING_COUNT += 1;
  1626. $runHotel->REMAINING_COUNT += 1;
  1627. } else {
  1628. $runHotel->REMAINING_COUNT += 1;
  1629. }
  1630. $runHotel->SALED_COUNT -= 1;
  1631. $rs_run_hotel = $runHotel->save();
  1632. $rs_distribe = $distrib->save();
  1633. $logger->log([date("Y-m-d H:i:s"), '回退库存,订单信息:' . $this->ORDER_ID . ',run_hotel_distrib执行结果' . $rs_distribe . ',run_hotel执行结果:' . $rs_run_hotel . PHP_EOL], 'ali/error');
  1634. if (!$rs_run_hotel || !$rs_distribe) {
  1635. return false;
  1636. }
  1637. }
  1638. if ($this->DOCKING_TYPE != OrderMain::ORDER_TYPE_CHANNEL) {
  1639. //如果是携程渠道,并且是直连的房型,线下操作后,要及时推送最新的房态到携程
  1640. $diret_info = OrderMain::find()
  1641. ->leftJoin('opera_hotel_room b', 'a.PARENT_PROD_ID=b.HOTEL_ID and a.PROD_ID=b.ROOM_TYPE and b.CANCEL_FLAG=0')
  1642. ->leftJoin('channel_hotel_relation c', 'a.PARENT_PROD_ID=c.HotelId and c.ChannelId=' . Yii::$app->params['ctrip']['relation_supplier_id'])
  1643. ->leftJoin('channel_room_relation d', 'b.ID=d.RoomId and d.ChannelId=' . Yii::$app->params['ctrip']['relation_supplier_id'])
  1644. ->from('order_main a')
  1645. ->select(['a.ORDER_ID', 'a.PROD_START_STATION_DATE', 'a.PROD_END_STATION_DATE', 'b.ID', 'b.HOTEL_ID', 'b.PARENT_ROOM_TYPE', 'b.ROOM_TYPE', 'c.ChannelHotelId', 'd.ChannelRoomId'])
  1646. ->where(['a.ORDER_ID' => $this->ORDER_ID, 'a.PARENT_ORDER_ID' => 0, 'a.ORDER_PROD_TYPE' => 25, 'a.CANCEL_FLAG' => 0])
  1647. // -> createCommand() -> getRawSql();
  1648. ->asArray()->one();
  1649. if (!empty($diret_info['ChannelHotelId']) && isset($diret_info['ChannelRoomId'])) {
  1650. //向携程推送房态
  1651. $status_data = ['hotel_id' => $diret_info['HOTEL_ID'], 'parent_room_type' => $diret_info['PARENT_ROOM_TYPE'], 'room_type' => $diret_info['ROOM_TYPE'],
  1652. 'StartDate' => $diret_info['PROD_START_STATION_DATE'], 'EndDate' => $diret_info['PROD_END_STATION_DATE']];
  1653. $price_data = ['hotel_id' => $diret_info['HOTEL_ID'], 'parent_room_type' => $diret_info['PARENT_ROOM_TYPE'], 'room_type' => $diret_info['ROOM_TYPE'],
  1654. 'StartDate' => $diret_info['PROD_START_STATION_DATE'], 'EndDate' => $diret_info['PROD_END_STATION_DATE']];
  1655. $quantity_data = ['hotel_id' => $diret_info['HOTEL_ID'], 'parent_room_type' => $diret_info['PARENT_ROOM_TYPE'], 'room_type' => $diret_info['ROOM_TYPE'],
  1656. 'StartDate' => $diret_info['PROD_START_STATION_DATE'], 'EndDate' => $diret_info['PROD_END_STATION_DATE']];
  1657. $log = new TopLogger();
  1658. $room_info_res = Yii::$app->runAction('hotel/ctrip/set-room-info', ['param' => $status_data]);
  1659. $log->log([date("Y-m-d H:i:s"), '推送房态结果:' . $room_info_res . PHP_EOL], 'ali/error');
  1660. $room_price_res = Yii::$app->runAction('hotel/ctrip/set-room-price', ['param' => $price_data]);
  1661. $log->log([date("Y-m-d H:i:s"), '推送房价结果:' . $room_price_res . PHP_EOL], 'ali/error');
  1662. $room_quantity_res = Yii::$app->runAction('hotel/ctrip/update-room-quantity', ['param' => $quantity_data]);
  1663. $log->log([date("Y-m-d H:i:s"), '推送保留房结果:' . $room_quantity_res . PHP_EOL], 'ali/error');
  1664. }
  1665. }
  1666. $log = new TopLogger();
  1667. $model = new BaseBalance($this->ORDER_ID, 2, '订单取消,金额回退');
  1668. $supplier_data = $model->cancelBalanceMain(); //供应商取消
  1669. $log->log([date("Y-m-d H:i:s"), '供应商:' . json_encode($supplier_data) . PHP_EOL], 'yufukuan');
  1670. $channel_data = $model->cancelChannelBalanceMain(); // 渠道商取消
  1671. $log->log([date("Y-m-d H:i:s"), '渠道商:' . json_encode($channel_data) . PHP_EOL], 'yufukuan');
  1672. return true;
  1673. }
  1674. /**
  1675. * 订单是否可下,区别于直接
  1676. *
  1677. * @author wangxj
  1678. */
  1679. public function orderAvailable()
  1680. {
  1681. $room = $this->operaHotelRoom;
  1682. if ($room == null || $room->IS_ONSALE == 0) {
  1683. $this->addError('PROD_ID', '房型已下线');
  1684. }
  1685. $roomDistrib = OperaRoomDistrib::findOne(['ROOM_ID' => $room->ID, 'DISTRIB_ID' => $this->OUTSIDE_SALE_ORG_ID, 'CANCEL_FLAG' => 0]);
  1686. if ($roomDistrib == null || $roomDistrib->AUTHORITY_STATUS == 0) {
  1687. $this->addError('OUTSIDE_SALE_ORG_ID', '该房型渠道授权已关闭');
  1688. } else {
  1689. $channelRoom = $this->channelRoom;
  1690. if ($channelRoom->RUN_STATUS == 329) {
  1691. $this->addError('PROD_ID', $this->RUN_DATE . ' 已关房');
  1692. }
  1693. $subRoom = $channelRoom->runHotelSubRoom;
  1694. if ($subRoom == null || $subRoom->RUN_STATUS == 0) {
  1695. $this->addError('PROD_ID', $this->RUN_DATE . ' 已满房');
  1696. }
  1697. $roomStock = $channelRoom->roomStock;
  1698. if ($roomStock == null) {
  1699. $this->addError('PROD_ID', $this->RUN_DATE . ' 基础库存数据错误,请联系后台查看原因');
  1700. } else {
  1701. $count = 0;
  1702. foreach ($roomStock as $item) {
  1703. $count += $item->REMAINING_COUNT;
  1704. }
  1705. if ($count < $this->room_count) {
  1706. $this->addError('PROD_ID', $this->RUN_DATE . ' 基础房型库存不足');
  1707. }
  1708. }
  1709. if ($channelRoom->REMAINING_COUNT < $this->room_count && $channelRoom->OVERSELL_FLAG == 0) {
  1710. $this->addError('PROD_ID', $this->RUN_DATE . ' 房型渠道库存不足');
  1711. }
  1712. }
  1713. }
  1714. /**
  1715. * Notes:将其他库存大于基础房型买断+保留的渠道库存设置为买断+保留
  1716. * User: Steven
  1717. * Date: 2018/1/9
  1718. * Time: 18:20
  1719. * @param $hotel_id
  1720. * @param $room_id
  1721. * @param $check_in
  1722. * @param $check_out
  1723. * @param $distrib_id
  1724. */
  1725. public function UpdateStockByShare($params)
  1726. {
  1727. $query = RunHotelDistrib::find()
  1728. ->select(['a.ID', 'a.DISTRIB_ID', 'a.HOTEL_ID', 'a.BASE_ROOM_TYPE', 'b.ROOM_TYPE', 'a.RUN_DATE', 'a.REMAINING_COUNT',
  1729. 'a.PROD_PRICE', 'a.CUS_PRICE', 'a.RUN_STATUS as DISTRIB_RUN_STATUS', 'a.OVERSELL_FLAG', 'c.STOCK_TYPE',
  1730. 'c.IS_ONSALE as ROOM_DAY_IS_ONSALE', 'b.IS_ONSALE as ROOM_IS_ONSALE', 'a.GIFT_ID',
  1731. 'SUM(case c.stock_type when 228 then c.remaining_count else 0 end) as BUYOUT', //买断
  1732. 'SUM(case c.stock_type when 229 then c.remaining_count else 0 end) as INQUIRY', //现询
  1733. 'SUM(case c.stock_type when 230 then c.remaining_count else 0 end) as RETAIN'//保留
  1734. ])
  1735. ->joinWith('operaHotelRoom b', false)
  1736. ->joinWith(['runHotel c'], false)
  1737. ->from('run_hotel_distrib a')
  1738. ->where([
  1739. 'a.HOTEL_ID' => $params['hotel_id'],
  1740. 'b.ID' => $params['room_id'],
  1741. ]);
  1742. $query->andFilterWhere(['between', 'a.RUN_DATE', $params['check_in'], $params['check_out']])->groupBy('a.ID');
  1743. $sql = $query->createCommand()->getRawSql();
  1744. $data = $query->asArray()->all();
  1745. if (!empty($data)) {
  1746. foreach ($data as $item) {
  1747. if ($item['REMAINING_COUNT'] > $item['RETAIN'] + $item['BUYOUT']) {
  1748. RunHotelDistrib::updateAll([
  1749. 'REMAINING_COUNT' => $item['RETAIN'] + $item['BUYOUT']],
  1750. ['ID' => $item['ID']]);
  1751. $soap_param = array('hotel_id' => $params['hotel_id'], 'parent_room_type' => $item['BASE_ROOM_TYPE'], 'room_type' => $item['ROOM_TYPE'],
  1752. 'begin_date' => $item['RUN_DATE'], 'end_date' => $item['RUN_DATE'], 'channel_id' => $item['DISTRIB_ID']);
  1753. zHttp::syncRequest(CommonOrder::SEND_REQUEST_GET, Yii::$app->params['push_info_interface'], array('param' => $soap_param));
  1754. }
  1755. }
  1756. }
  1757. }
  1758. /**
  1759. * Notes:返回对象中的错误数据
  1760. * User: Steven
  1761. * Date: 2017/12/29
  1762. * Time: 18:00
  1763. * @param null $obj
  1764. * @return string
  1765. */
  1766. public function getErrorMsg($obj = null)
  1767. {
  1768. $obj = empty($obj) ? $this : $obj;
  1769. $errors = $obj->getErrors();
  1770. $str = [];
  1771. foreach ($errors as $error) {
  1772. $str[] = implode(';', $error);
  1773. }
  1774. return implode(';', $str);
  1775. }
  1776. /**
  1777. * @Author wanglg
  1778. * @Desc 验证同一渠道下订单号不能重复
  1779. * @param $attribute
  1780. */
  1781. public function noRepeat($attribute)
  1782. {
  1783. $res = OrderMain::findOne(['OUTSIDE_SALE_ORG_ID' => $this->OUTSIDE_SALE_ORG_ID, 'OUTSIDE_ORDER_NO' => $this->$attribute]);
  1784. if ($res) {
  1785. $this->addError($attribute, '渠道订单号已存在');
  1786. }
  1787. }
  1788. /**
  1789. * @Author wanglg
  1790. * @Desc 保存备注信息
  1791. * @return bool|\yii\web\Response
  1792. */
  1793. public function comment($param)
  1794. {
  1795. if (empty($param['comment_txt']) || empty($param['order_id'])) {
  1796. return false;
  1797. }
  1798. // 查询主订单
  1799. $main_order = OrderMain::find()
  1800. ->select(['ORDER_STATUS', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE'])
  1801. ->joinWith('operaHotelRoom')
  1802. ->from('order_main')
  1803. ->where(['ORDER_ID' => $param['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN])
  1804. ->asArray()->one();
  1805. foreach ($param['comment_txt'] as $key => $val) {
  1806. $comment = new OrderComment();
  1807. if (trim($val) != '') {
  1808. $comment_arr = array('ORDER_ID' => $param['order_id'], 'COMMENT_TYPE' => $key, 'COMMENT_TXT' => $val,
  1809. 'CANCEL_FLAG' => 0, 'CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'UPDATE_USER_ID' => 0, 'UPDATE_TIME' => '0');
  1810. if ($comment->load($comment_arr, '') && $comment->validate()) {
  1811. if (!$comment->save()) {
  1812. return false;
  1813. }
  1814. }
  1815. // 如果是已确认或退改中的订单修改生成修改单
  1816. if ($key == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) {
  1817. OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1],
  1818. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $param['order_id'], 'PARENT_ORDER_ID=' . $param['order_id']]]);
  1819. }
  1820. $log_type = $key == 0 ? '内部备注' : '公共备注';
  1821. $log_desc = "添加备注:【{$log_type}】 【{$val}】";
  1822. $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'],
  1823. 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $param['order_id']);
  1824. $order_log = new OperaHotelLog();
  1825. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  1826. if (!$order_log->save()) {
  1827. throw new \Exception('记录日志失败!');
  1828. }
  1829. }
  1830. }
  1831. }
  1832. return true;
  1833. }
  1834. /**
  1835. * @Author wanglg
  1836. * @Desc 删除备注
  1837. * @return int|\yii\web\Response
  1838. */
  1839. public function delComment($param)
  1840. {
  1841. $order = OrderComment::findOne($param['comment_id']);
  1842. $order->CANCEL_FLAG = 1;
  1843. $order->UPDATE_USER_ID = Yii::$app->user->id;
  1844. $order->UPDATE_TIME = date('Y-m-d H:i:s');
  1845. if (!$order->save()) {
  1846. return false;
  1847. }
  1848. $main_order = OrderMain::find()
  1849. ->select(['order_main.ORDER_STATUS', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE'])
  1850. ->joinWith('operaHotelRoom')
  1851. ->from('order_main')
  1852. ->where(['ORDER_ID' => $param['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN])
  1853. ->asArray()->one();
  1854. $log_type = $order['COMMENT_TYPE'] == 0 ? '内部备注' : '公共备注';
  1855. // 如果是公共备注生成修改单
  1856. if ($order->COMMENT_TYPE == 1 && in_array($main_order['ORDER_STATUS'], array(198, 382))) {
  1857. OrderMain::updateAll(['UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1],
  1858. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $order->ORDER_ID, 'PARENT_ORDER_ID=' . $order->ORDER_ID]]);
  1859. }
  1860. $log_desc = "删除备注:【{$log_type}】 【{$order['COMMENT_TXT']}】";
  1861. $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'],
  1862. 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $param['order_id']);
  1863. $order_log = new OperaHotelLog();
  1864. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  1865. if (!$order_log->save()) {
  1866. throw new \Exception('记录日志失败!');
  1867. }
  1868. }
  1869. return true;
  1870. }
  1871. /**
  1872. * @Author wanglg
  1873. * @Desc 修改客人姓名
  1874. * @return int|\yii\web\Response
  1875. */
  1876. public function updateCustomer($param)
  1877. {
  1878. $main_order = OrderMain::find()
  1879. ->select(['ORDER_STATUS', 'CUSTOMER_NAME', 'opera_hotel_room.PARENT_ROOM_TYPE', 'opera_hotel_room.HOTEL_ID', 'opera_hotel_room.ROOM_TYPE'])
  1880. ->joinWith('operaHotelRoom')
  1881. ->from('order_main')
  1882. ->where(['ORDER_ID' => $param['order_id'], 'order_main.CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => 0, 'ORDER_PROD_TYPE' => OrderMain::ORDER_PROD_TYPE_MAIN])
  1883. ->asArray()->one();
  1884. if (in_array($main_order['ORDER_STATUS'], array(198, 382))) {
  1885. $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $param['customer_name'], 'CUSTOMER_MOBILE' => $param['customer_mobile'],
  1886. 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s'), 'ORDER_LEVEL' => 1],
  1887. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $param['order_id'], 'PARENT_ORDER_ID=' . $param['order_id']]]);
  1888. } else {
  1889. $update_res = OrderMain::updateAll(['CUSTOMER_NAME' => $param['customer_name'], 'CUSTOMER_MOBILE' => $param['customer_mobile'],
  1890. 'UPDATE_USER_ID' => Yii::$app->user->id, 'UPDATE_TIME' => date('Y-m-d H:i:s')],
  1891. ['and', 'CANCEL_FLAG=0', 'ORDER_PROD_TYPE in (25, 26)', ['or', 'ORDER_ID=' . $param['order_id'], 'PARENT_ORDER_ID=' . $param['order_id']]]);
  1892. }
  1893. // 修改成功则添加日志记录
  1894. if ($update_res) {
  1895. $log_desc = "修改客人信息:修改客人信息【{$main_order['CUSTOMER_NAME']}】为【{$param['customer_name']}】";
  1896. $log_arr = array('CREATE_USER_ID' => Yii::$app->user->id, 'CREATE_TIME' => date('Y-m-d H:i:s'), 'LOG_TYPE' => OperaHotelLog::LOG_TYPE_ORDER, 'HOTEL_ID' => $main_order['HOTEL_ID'],
  1897. 'PARENT_ROOM_TYPE' => $main_order['PARENT_ROOM_TYPE'], 'ROOM_TYPE' => $main_order['ROOM_TYPE'], 'LOG_DESC' => $log_desc, 'ORDER_ID' => $param['order_id']);
  1898. $order_log = new OperaHotelLog();
  1899. if ($order_log->load($log_arr, '') && $order_log->validate()) {
  1900. if (!$order_log->save()) {
  1901. throw new \Exception('记录日志失败!');
  1902. }
  1903. }
  1904. }
  1905. return empty($update_res) ? false : true;
  1906. }
  1907. /**
  1908. * @Author wanglg
  1909. * @Desc 获取库存数组
  1910. * @param $params
  1911. * @return mixed
  1912. */
  1913. public function getOrderRoomNum($id, $params)
  1914. {
  1915. $common_order = new CommonOrder(['scenario' => 'Product']);
  1916. $common_order->load($params, '');
  1917. $stock_info = $common_order->getChannelStock($id);
  1918. $arr = [];
  1919. foreach ($stock_info as $item) {
  1920. $arr[] = $item['OVERSELL_FLAG'] == 1 ? $item['BUYOUT'] + $item['INQUIRY'] + $item['RETAIN'] : $item['REMAINING_COUNT'];
  1921. }
  1922. if (!empty($stock_info)) {
  1923. $minStock = min($arr) > 20 ? 20 : min($arr);
  1924. for ($i = 0; $i <= $minStock; $i++) {
  1925. $stock_arr[$i] = [
  1926. 'stock_id' => $i,
  1927. 'stock_count' => $i,
  1928. ];
  1929. }
  1930. }
  1931. return $stock_arr;
  1932. }
  1933. /**
  1934. * @Author wanglg
  1935. * @Desc 获取库存价格列表
  1936. * @param $request
  1937. * @return array
  1938. */
  1939. public function getStockPriceList($request)
  1940. {
  1941. if (!isset($request['RoomNum'])) {
  1942. return array('code' => 1, 'info' => '缺少必要参数');
  1943. }
  1944. $orderModel = new CommonOrder(['scenario' => 'Product']);
  1945. if ($orderModel->load($request, '') && $orderModel->validate()) {
  1946. $price_res = $orderModel->getChannelStock($request['id']);
  1947. foreach ($price_res as $key => $val) {
  1948. $price_res[$key]['ORDER_PRICE'] = $val['PROD_PRICE'];
  1949. $price_res[$key]['ALL_PRICE'] = $val['PROD_PRICE'] * $request['RoomNum'];
  1950. $price_res[$key]['MID_PRICE'] = 0;
  1951. // 渠道佣金计算
  1952. $single_commission = 0;
  1953. if ($val['COMMISION_FLAG'] == 1) {
  1954. if ($val['BACK_COMMISION_METHOD'] == BaseSupplier::BACK_COMMISION_METHOD_SALE) { //按照销售额 按返佣比例计算 取百分比
  1955. $single_commission = $val['PROD_PRICE'] * ($val['BACK_PERCENT'] / 100) * $request['RoomNum'];
  1956. } elseif ($val['BACK_COMMISION_METHOD'] == BaseSupplier::BACK_COMMISION_METHOD_SETTLE) { //按结算金额 按返佣固定金额 取固定金额
  1957. $single_commission = $val['BACK_VALUE'] * $request['RoomNum'];
  1958. } else {
  1959. $commission[BaseSupplier::BACK_COMMISION_METHOD_SETTLE] = 0;
  1960. }
  1961. } else {
  1962. $single_commission = 0;
  1963. }
  1964. $price_res[$key]['TOTAL_COMMISSION'] = $single_commission;
  1965. // 计算订单平均单价
  1966. if ($val['BUYOUT'] >= $request['RoomNum']) {
  1967. $price_res[$key]['BASE_PRICE'] = round($val['BASE_PRICE_BUYOUT'], 2);
  1968. $price_res[$key]['BENEFIT'] = (($val['PROD_PRICE'] - $val['BASE_PRICE_BUYOUT']) * $request['RoomNum']) - $single_commission;
  1969. } elseif ($val['BUYOUT'] + $val['RETAIN'] >= $request['RoomNum']) {
  1970. $price_res[$key]['BASE_PRICE'] = round(($val['BUYOUT'] * $val['BASE_PRICE_BUYOUT'] +
  1971. $val['BASE_PRICE_RESERVE'] * ($request['RoomNum'] - $val['BUYOUT'])) / $request['RoomNum'], 2);
  1972. //订单利润
  1973. $price_res[$key]['BENEFIT'] = ($val['BUYOUT'] * ($val['PROD_PRICE'] - $val['BASE_PRICE_BUYOUT']) + ($val['PROD_PRICE'] - $val['BASE_PRICE_RESERVE']) * ($request['RoomNum'] - $val['BUYOUT'])) - $single_commission;
  1974. } elseif ($val['BUYOUT'] + $val['RETAIN'] + $val['INQUIRY']) {
  1975. $price_res[$key]['BASE_PRICE'] = round(($val['BUYOUT'] * $val['BASE_PRICE_BUYOUT'] +
  1976. $val['BASE_PRICE_RESERVE'] * $val['RETAIN'] +
  1977. $val['BASE_PRICE_INQUIRY'] * ($request['RoomNum'] - $val['BUYOUT'] - $val['RETAIN'])) / $request['RoomNum'], 2);
  1978. $price_res[$key]['BENEFIT'] = $val['BUYOUT'] * ($val['PROD_PRICE'] - $val['BASE_PRICE_BUYOUT'])
  1979. + $val['RETAIN'] * ($val['PROD_PRICE'] - $val['BASE_PRICE_RESERVE'])
  1980. + ($request['RoomNum'] - $val['BUYOUT'] - $val['RETAIN']) * ($val['PROD_PRICE'] - $val['BASE_PRICE_INQUIRY']) - $single_commission;
  1981. }
  1982. }
  1983. return $price_res;
  1984. } else {
  1985. $error = array_values($orderModel->getFirstErrors());
  1986. return array('code' => 1, 'info' => implode('|', $error));
  1987. }
  1988. }
  1989. /**
  1990. * @Author wanglg
  1991. * @Desc 修改入住需求
  1992. * @param $params
  1993. * @return string
  1994. */
  1995. public function updateCheckin($param)
  1996. {
  1997. $avail_data = array(
  1998. 'HotelID' => $param['hotel_id'],
  1999. 'RoomID' => $param['room_id'],
  2000. 'RoomNum' => $param['room_count'],
  2001. 'CheckIn' => $param['start_date'],
  2002. 'CheckOut' => $param['end_date'],
  2003. 'DistribID' => $param['org_id'],
  2004. 'CreateUserID' => $param['user_id'],
  2005. 'RoomPrices' => 0,
  2006. 'IfCheckPrice' => false,
  2007. );
  2008. $newOrder = new CommonOrder(['scenario' => 'CheckRoomAvail']);
  2009. if (!$newOrder->load($avail_data, '') || !$newOrder->validate()) {
  2010. $error = array_values($newOrder->getFirstErrors());
  2011. return json_encode(['code' => 1, 'info' => $error[0]]);
  2012. }
  2013. $is_avail = $newOrder->checkRoomAvail($param['order_id']);
  2014. if ($is_avail['code'] != 0) {
  2015. return json_encode(['code' => 2, 'info' => $is_avail['info']]);
  2016. }
  2017. $room_price = array();
  2018. foreach ($is_avail['data']['room_price'] as $k => $room) {
  2019. $room_price[] = array('RunDate' => $room['run_date'], 'Price' => $room['price']);
  2020. }
  2021. // 客人信息
  2022. $uncus_names = explode(' ', $param['customer_name']);
  2023. $all_cus_name = array_values(array_filter($uncus_names));
  2024. $split_customer = array_map("self::customer", $all_cus_name);
  2025. $make_order_arr = array(
  2026. 'CreateUserID' => Yii::$app->user->id,
  2027. 'ZZ_ORDER_ID' => $param['order_id'], //蜘蛛订单号
  2028. 'OrderID' => $param['org_num'], //渠道订单号
  2029. 'HotelID' => $param['hotel_id'], //酒店ID
  2030. 'RoomID' => $param['room_id'], //房型ID
  2031. 'DistribID' => $param['org_id'],//渠道ID
  2032. 'RoomNum' => $param['room_count'], //房间数量
  2033. 'CheckIn' => $param['start_date'], //入住日期
  2034. 'CheckOut' => $param['end_date'], //离店日期,
  2035. 'TotalPrice' => $is_avail['data']['total_price'],//订单总价
  2036. 'Currency' => 'RMB', //币种
  2037. 'ContactName' => $param['customer_name'],//联系人姓名
  2038. 'ContactTel' => $param['customer_mobile'], //联系人电话
  2039. 'OrderGuests' => $split_customer, //入住人信息
  2040. 'Comment' => $param['customer_memo'], //客人备注
  2041. 'NeedInvoice' => 0,
  2042. 'InvoiceInfos' => array(),
  2043. 'RoomPrices' => $room_price,
  2044. );
  2045. $newUpdateOrder = new CommonOrder(['scenario' => 'UpdateHotelOrder']);
  2046. if ($newUpdateOrder->load($make_order_arr, '')) {
  2047. $res = $newUpdateOrder->updateHotelOrder();
  2048. return json_encode($res);
  2049. } else {
  2050. $error = array_values($newOrder->getFirstErrors());
  2051. return json_encode(['code' => 3, 'info' => $error[0]]);
  2052. }
  2053. }
  2054. /**
  2055. * @Author wanglg
  2056. * @Desc 客人信息处理
  2057. * @param $item
  2058. * @return array
  2059. */
  2060. public static function customer($item)
  2061. {
  2062. return array('Name' => $item);
  2063. }
  2064. /**
  2065. * @Author wanglg
  2066. * @Desc根据订单获取当前订单的房间数
  2067. * @param $order_id
  2068. * @return mixed
  2069. */
  2070. public function getRoomNum($order_id)
  2071. {
  2072. $order_info = OrderMain::find()
  2073. ->select(['COUNT(ORDER_ID) as room_num'])
  2074. // ->where(['AND', ['=', 'CANCEL_FLAG', 0], ['OR', ['=', 'ORDER_ID', $order_id], ['=', 'PARENT_ORDER_ID', $order_id]]])
  2075. ->where(['CANCEL_FLAG' => 0, 'PARENT_ORDER_ID' => $order_id, 'ORDER_VALID_STATUS' => 1, 'ORDER_LEVEL' => [0, 1]])
  2076. ->groupBy('RUN_DATE')
  2077. ->limit(1)
  2078. ->asArray()->one();
  2079. return $order_info['room_num'];
  2080. }
  2081. /**
  2082. * Function Description:根据外部订单号查询订单是否存在
  2083. * Function Name: checkOutsideId
  2084. * @param $outside_id
  2085. * @param $supplier_id
  2086. * @return array|ActiveRecord[]
  2087. *
  2088. * @author 娄梦宁
  2089. */
  2090. public static function getInfoByOutsideId($outside_id, $supplier_id)
  2091. {
  2092. $result = self::find()->from(self::tableName())
  2093. ->where(['and', ['=', 'cancel_flag', 0], ['=', 'outside_sale_org_id', $supplier_id], ['=', 'outside_order_no', $outside_id]])
  2094. ->asArray()->all();
  2095. return $result;
  2096. }
  2097. /**
  2098. * Function Description:查询订单外部订单号
  2099. * Function Name: getOutSideId
  2100. * @param $order_id
  2101. *
  2102. * @return mixed
  2103. *
  2104. * @author 娄梦宁
  2105. */
  2106. public function getOutSideId($order_id)
  2107. {
  2108. $result = self::find()->select('outside_order_no')->from(self::tableName())
  2109. ->where(['and', ['=', 'cancel_flag', 0], ['=', 'order_id', $order_id]])
  2110. ->asArray()
  2111. ->one();
  2112. return $result['outside_order_no'];
  2113. }
  2114. }