ExcelOrderDecForm.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. namespace common\models\forms;
  3. use common\helpers\Date;
  4. use common\helpers\snowflake\SnowFake;
  5. use common\models\ExcelOrderShop;
  6. use common\models\OrderDec;
  7. use common\models\OrderGoodsDec;
  8. use common\models\Period;
  9. use common\models\User;
  10. use common\models\UserInfo;
  11. use Yii;
  12. use yii\base\Exception;
  13. class ExcelOrderDecForm extends \common\components\ActiveRecord
  14. {
  15. CONST EXCEL_ORDER_SHOP_FIELD = [
  16. '会员编号' => 'USER_NAME',
  17. // '报单中心' => 'DEC_USER_NAME',
  18. // '订单号' => 'ORDER_SN',
  19. '订单状态' => 'STATUS',
  20. '收货人' => 'CONSIGNEE',
  21. '联系方式1' => 'MOBILE',
  22. '省' => 'PROVINCE',
  23. '市' => 'CITY',
  24. '区' => 'COUNTY',
  25. '详细地址' => 'ADDRESS',
  26. '期数' => 'PERIOD_NUM',
  27. '订单类型' => 'ORDER_TYPE',
  28. '创建时间' => 'CREATED_AT',
  29. '支付时间' => 'PAY_AT',
  30. '发货时间' => 'DELIVERY_AT',
  31. '运费' => 'FREIGHT',
  32. '快递公司' => 'EXPRESS_COMPANY',
  33. '快递单号' => 'ORDER_TRACK_NO',
  34. '发货方式' => 'EXPRESS_TYPE',
  35. '会员备注' => 'FRONT_REMARK',
  36. '发货仓' => 'WAREHOUSE',
  37. '发货状态' => 'DELIVERY_STATUS',
  38. ];
  39. CONST EXCEL_ORDER_SHOP_GOODS_FIELD = [
  40. '订单号' => 'ORDER_SN',
  41. // '订单状态' => 'STATUS',
  42. '存货编码' => 'SKU_CODE',
  43. '存货名称' => 'GOODS_TITLE',
  44. '数量' => 'BUY_NUMS',
  45. '商品单价' => 'PRICE',
  46. '商品金额' => 'REAL_PRICE',
  47. '商品BV' => 'PV',
  48. 'BV合计' => 'REAL_PV',
  49. '期数' => 'PERIOD_NUM',
  50. ];
  51. private $_isSentMaxPeriodNum = 0;
  52. /**
  53. * 初始化最小未挂网的期数
  54. */
  55. public function initNoClosedMinPeriodNum() {
  56. $periodModel = Period::instance();
  57. $this->_isSentMaxPeriodNum = $periodModel->getMaxIsSentPeriodNum();
  58. }
  59. /**
  60. * 导入excel数据
  61. * @param $excelData
  62. * @param $orderDay
  63. * @param $payType
  64. * @return bool
  65. * @throws \Exception
  66. */
  67. public function run($excelData,$orderDay,$payType) {
  68. if( !$excelData ) return false;
  69. $this->initNoClosedMinPeriodNum();
  70. foreach ($excelData as $everyData) {
  71. if( !$everyData ) continue;
  72. $formatOrderData = [];
  73. $formatOrderGoodsData = [];
  74. foreach ($everyData as $key => $value) {
  75. if(isset(self::EXCEL_ORDER_SHOP_FIELD[$key])) {
  76. $formatOrderData[self::EXCEL_ORDER_SHOP_FIELD[$key]] = $value;
  77. }
  78. if(isset(self::EXCEL_ORDER_SHOP_GOODS_FIELD[$key])) {
  79. $formatOrderGoodsData[self::EXCEL_ORDER_SHOP_GOODS_FIELD[$key]] = $value;
  80. }
  81. }
  82. if( !isset($formatOrderGoodsData['ORDER_SN']) ) {
  83. throw new \Exception('缺少订单编号字段');
  84. }
  85. if ( !isset($formatOrderData['PERIOD_NUM']) ) {
  86. throw new \Exception('缺少期数字段');
  87. }
  88. if ( $formatOrderData['PERIOD_NUM'] <= $this->_isSentMaxPeriodNum ) {
  89. throw new \Exception(sprintf('不可以导入已经挂网期数【%s】的数据', $formatOrderData['PERIOD_NUM']));
  90. }
  91. //判断商城订单是表中是否已经存在该订单
  92. $one = OrderDec::find()->select(["USER_ID", "PERIOD_NUM", "SN", "ORDER_AMOUNT", "PV", "PAY_AMOUNT", "PAY_PV"])->where('SN=:SN', ['SN' => $formatOrderGoodsData['ORDER_SN']])->asArray()->one();
  93. if ($one) {
  94. if ( $one['PERIOD_NUM'] != $formatOrderData['PERIOD_NUM'] ) {
  95. throw new \Exception(sprintf('订单号【%s】重复不可以导入', $formatOrderGoodsData['ORDER_SN']));
  96. }
  97. OrderDec::updateAllCounters([
  98. 'ORDER_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  99. 'PV' => $formatOrderGoodsData['REAL_PV'],
  100. 'PAY_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  101. 'PAY_PV' => $formatOrderGoodsData['REAL_PV'],
  102. ], 'SN=:SN', [
  103. 'SN' => $formatOrderGoodsData['ORDER_SN']
  104. ]);
  105. //会员状态激活
  106. $amount = $one['ORDER_AMOUNT'] + $formatOrderGoodsData['REAL_PRICE'];
  107. if ($amount >= 300) {
  108. $userStatus = User::find()->select(["ID", "STATUS"])->where('ID=:ID', ['ID' => $one['USER_ID']])->asArray()->one();
  109. if ($userStatus && $userStatus['STATUS'] == 0) {
  110. User::updateAll(['STATUS' => 1], 'ID=:ID', ['ID' => $one['USER_ID']]);
  111. }
  112. }
  113. unset($amount, $userStatus);
  114. } else {
  115. $userInfoArr = UserInfo::findOneAsArray('USER_NAME=:USER_NAME', [':USER_NAME' => $formatOrderData['USER_NAME']], 'USER_ID');
  116. if (!isset($userInfoArr['USER_ID']) || !$userInfoArr['USER_ID']) {
  117. // echo $formatOrderData['USER_NAME'] . PHP_EOL;
  118. continue;
  119. }
  120. //insertOrderDec
  121. $orderShopInsertData = array_merge($formatOrderData, [
  122. 'ID' => SnowFake::instance()->generateId(),
  123. 'SN' => $formatOrderGoodsData['ORDER_SN'],
  124. 'USER_ID' => $userInfoArr['USER_ID'],
  125. 'ORDER_TYPE' => 'ZC',
  126. 'ORDER_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  127. 'PV' => $formatOrderGoodsData['REAL_PV'],
  128. 'PAY_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  129. 'PAY_PV' => $formatOrderGoodsData['REAL_PV'],
  130. 'PAY_AT' => strtotime(self::excelTime($formatOrderData['PAY_AT'])),
  131. 'DELIVERY_AT' => strtotime(self::excelTime($formatOrderData['DELIVERY_AT'])),
  132. 'CREATED_AT' => strtotime(self::excelTime($formatOrderData['CREATED_AT'])),
  133. 'CREATE_USER' => $formatOrderData['USER_NAME'],
  134. 'PAY_TYPE' => $payType,//@todo
  135. 'STATUS' => 1,
  136. 'P_CALC_MONTH' => self::excelTime($formatOrderData['CREATED_AT'],'Y-m-d'),
  137. 'DELIVERY_STATUS' => $formatOrderData['DELIVERY_STATUS'] === '已发货' ? 1 : 0,
  138. 'ORDER_DAY' => $orderDay,
  139. ]);
  140. OrderDec::insertOne($orderShopInsertData);
  141. //会员状态激活
  142. if ($orderShopInsertData['ORDER_AMOUNT'] >= 300) {
  143. $userStatus = User::find()->select(["ID", "STATUS"])->where('ID=:ID', ['ID' => $userInfoArr['USER_ID']])->asArray()->one();
  144. if ($userStatus && $userStatus['STATUS'] == 0) {
  145. User::updateAll(['STATUS' => 1], 'ID=:ID', ['ID' => $userInfoArr['USER_ID']]);
  146. }
  147. }
  148. unset($orderShopInsertData, $userInfoArr, $userStatus);
  149. }
  150. $decGoodsInsertData[] = array_merge($formatOrderGoodsData, [
  151. 'ORDER_DAY' => $orderDay,
  152. 'P_CALC_MONTH' => self::excelTime($formatOrderData['CREATED_AT'],'Y-m-d')
  153. ]);
  154. unset($formatOrderData, $formatOrderGoodsData, $everyData);
  155. }
  156. if( isset($decGoodsInsertData) && $decGoodsInsertData ) OrderGoodsDec::batchInsert($decGoodsInsertData);
  157. unset($newStartRow, $goodsInsertData,$decGoodsInsertData);
  158. return true;
  159. }
  160. /**
  161. * 检测导入状态
  162. * @param $orderDay
  163. * @throws Exception
  164. * @throws \yii\db\Exception
  165. */
  166. public function checkStatus($orderDay) {
  167. // if( !$periodNum ) {
  168. // throw new Exception('期数不能为空');
  169. // }
  170. $periodData = Period::getPeriodFromTime(strtotime($orderDay));
  171. if(!$periodData){
  172. throw new Exception('期数有误');
  173. }
  174. $periodNum = $periodData['PERIOD_NUM'];
  175. //检查是否已经导入过了
  176. $excelPeriodData = ExcelOrderShop::find()->where("ORDER_DAY=:ORDER_DAY AND ORDER_TYPE='ZC'", [':ORDER_DAY'=>$orderDay])->asArray()->one();
  177. if( !$excelPeriodData ) {
  178. ExcelOrderShop::insertOne(
  179. [
  180. 'ID' => SnowFake::instance()->generateId(),
  181. 'PERIOD_NUM' => $periodNum,
  182. 'ORDER_DAY' => $orderDay,
  183. 'ORDER_TYPE' => 'ZC',
  184. 'STATUS' => 0,
  185. 'CREATED_AT' => Date::nowTime(),
  186. ]
  187. );
  188. }
  189. // if( $excelPeriodData['STATUS'] == 1 ) {
  190. // throw new Exception(sprintf('%s订单已经导入过了,不可以重复导入', $orderDay));
  191. // }
  192. //清空已经导入的数据
  193. $this->_clearPeriodOrder($orderDay);
  194. }
  195. protected function _clearPeriodOrder($orderDay) {
  196. OrderDec::pageDeleteAll("ORDER_DAY='".$orderDay."'");
  197. OrderGoodsDec::pageDeleteAll("ORDER_DAY='".$orderDay."'");
  198. }
  199. public function finished($orderDay) {
  200. if( !$orderDay ) return false;
  201. ExcelOrderShop::updateAll(['STATUS' => 1], "ORDER_DAY=:ORDER_DAY AND ORDER_TYPE='ZC'", [':ORDER_DAY'=>$orderDay]);
  202. return true;
  203. }
  204. public function excelTime($orderDay,$format='Y-m-d H:i:s') {
  205. if(is_numeric($orderDay)){
  206. $t1 = intval(($orderDay - 25569) * 3600 * 24);
  207. $orderDay=gmdate($format,$t1);
  208. }
  209. return $orderDay;
  210. }
  211. }