ExcelOrderShopForm.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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\OrderGoodsShop;
  7. use common\models\OrderShop;
  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 ExcelOrderShopForm 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. '商品标准单价' => 'PRICE_STANDARD',
  47. '商品金额' => 'REAL_PRICE',
  48. '商品PV' => 'PV',
  49. 'PV合计' => 'REAL_PV',
  50. '期数' => 'PERIOD_NUM',
  51. ];
  52. private $_isSentMaxPeriodNum = 0;
  53. /**
  54. * 初始化最小未挂网的期数
  55. */
  56. public function initNoClosedMinPeriodNum() {
  57. $periodModel = Period::instance();
  58. $this->_isSentMaxPeriodNum = $periodModel->getMaxIsSentPeriodNum();
  59. }
  60. /**
  61. * 导入excel数据
  62. * @param $excelData
  63. * @param $orderDay
  64. * @param $payType
  65. * @return bool
  66. * @throws \yii\db\Exception
  67. */
  68. public function run($excelData,$orderDay,$payType) {
  69. if( !$excelData ) return false;
  70. $this->initNoClosedMinPeriodNum();
  71. foreach ($excelData as $everyData) {
  72. if( !$everyData ) continue;
  73. $formatOrderData = [];
  74. $formatOrderGoodsData = [];
  75. foreach ($everyData as $key => $value) {
  76. if(isset(self::EXCEL_ORDER_SHOP_FIELD[$key])) {
  77. $formatOrderData[self::EXCEL_ORDER_SHOP_FIELD[$key]] = $value;
  78. }
  79. if(isset(self::EXCEL_ORDER_SHOP_GOODS_FIELD[$key])) {
  80. $formatOrderGoodsData[self::EXCEL_ORDER_SHOP_GOODS_FIELD[$key]] = $value;
  81. }
  82. }
  83. if( !isset($formatOrderGoodsData['ORDER_SN']) ) {
  84. throw new \Exception('缺少订单编号字段');
  85. }
  86. if ( !isset($formatOrderData['PERIOD_NUM']) ) {
  87. throw new \Exception('缺少期数字段');
  88. }
  89. if ( $formatOrderData['PERIOD_NUM'] <= $this->_isSentMaxPeriodNum ) {
  90. throw new \Exception(sprintf('不可以导入已经挂网期数【%s】的数据', $formatOrderData['PERIOD_NUM']));
  91. }
  92. //判断商城订单是表中是否已经存在该订单
  93. $one = OrderShop::find()->select(["USER_ID", "PERIOD_NUM", "SN", "ORDER_AMOUNT", "PV", "PAY_AMOUNT", "PAY_PV"])->where('SN=:SN', ['SN' => $formatOrderGoodsData['ORDER_SN']])->asArray()->one();
  94. if ($one) {
  95. if ( $one['PERIOD_NUM'] != $formatOrderData['PERIOD_NUM'] ) {
  96. throw new \Exception(sprintf('订单号【%s】重复不可以导入', $formatOrderGoodsData['ORDER_SN']));
  97. }
  98. OrderShop::updateAllCounters([
  99. 'ORDER_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  100. 'PV' => $formatOrderGoodsData['REAL_PV'],
  101. 'PAY_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  102. 'PAY_PV' => $formatOrderGoodsData['REAL_PV'],
  103. ], 'SN=:SN', [
  104. 'SN' => $formatOrderGoodsData['ORDER_SN']
  105. ]);
  106. //会员状态激活
  107. $amount = $one['ORDER_AMOUNT'] + $formatOrderGoodsData['REAL_PRICE'];
  108. if ($amount >= 300) {
  109. $userStatus = User::find()->select(["ID", "STATUS"])->where('ID=:ID', ['ID' => $one['USER_ID']])->asArray()->one();
  110. if ($userStatus && $userStatus['STATUS'] == 0) {
  111. User::updateAll(['STATUS' => 1], 'ID=:ID', ['ID' => $one['USER_ID']]);
  112. }
  113. }
  114. unset($amount, $userStatus);
  115. } else {
  116. $userInfoArr = UserInfo::findOneAsArray('USER_NAME=:USER_NAME', [':USER_NAME' => $formatOrderData['USER_NAME']], 'USER_ID');
  117. if (!isset($userInfoArr['USER_ID']) || !$userInfoArr['USER_ID']) {
  118. // echo $formatOrderData['USER_NAME'] . PHP_EOL;
  119. continue;
  120. }
  121. //insertOrderShop
  122. $orderShopInsertData = array_merge($formatOrderData, [
  123. 'ID' => SnowFake::instance()->generateId(),
  124. 'SN' => $formatOrderGoodsData['ORDER_SN'],
  125. 'USER_ID' => $userInfoArr['USER_ID'],
  126. 'ORDER_TYPE' => 'FX',
  127. 'ORDER_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  128. 'PV' => $formatOrderGoodsData['REAL_PV'],
  129. 'PAY_AMOUNT' => $formatOrderGoodsData['REAL_PRICE'],
  130. 'PAY_PV' => $formatOrderGoodsData['REAL_PV'],
  131. 'PAY_AT' => strtotime(self::excelTime($formatOrderData['PAY_AT'])),
  132. 'DELIVERY_AT' => strtotime(self::excelTime($formatOrderData['DELIVERY_AT'])),
  133. 'CREATED_AT' => strtotime(self::excelTime($formatOrderData['CREATED_AT'])),
  134. 'CREATE_USER' => $formatOrderData['USER_NAME'],
  135. 'PAY_TYPE' => $payType,//@todo
  136. 'STATUS' => 1,
  137. 'P_CALC_MONTH' => self::excelTime($formatOrderData['CREATED_AT'],'Y-m-d'),
  138. 'DELIVERY_STATUS' => $formatOrderData['DELIVERY_STATUS'] === '已发货' ? 1 : 0,
  139. 'ORDER_DAY' => $orderDay,
  140. ]);
  141. OrderShop::insertOne($orderShopInsertData);
  142. //会员状态激活
  143. if ($orderShopInsertData['ORDER_AMOUNT'] >= 300) {
  144. $userStatus = User::find()->select(["ID", "STATUS"])->where('ID=:ID', ['ID' => $userInfoArr['USER_ID']])->asArray()->one();
  145. if ($userStatus && $userStatus['STATUS'] == 0) {
  146. User::updateAll(['STATUS' => 1], 'ID=:ID', ['ID' => $userInfoArr['USER_ID']]);
  147. }
  148. }
  149. unset($orderShopInsertData, $userInfoArr, $userStatus);
  150. }
  151. $goodsInsertData[] = array_merge($formatOrderGoodsData, [
  152. 'ORDER_DAY' => $orderDay,
  153. 'PAY_TYPE' => $payType,
  154. 'P_CALC_MONTH' => self::excelTime($formatOrderData['CREATED_AT'],'Y-m-d')
  155. ]);
  156. unset($formatOrderData, $formatOrderGoodsData, $everyData);
  157. }
  158. if( isset($goodsInsertData) && $goodsInsertData ) OrderGoodsShop::batchInsert($goodsInsertData);
  159. unset($newStartRow, $goodsInsertData,$decGoodsInsertData);
  160. return true;
  161. }
  162. /**
  163. * 检测导入状态
  164. * @param $orderDay
  165. * @param $orderType
  166. * @throws Exception
  167. * @throws \yii\db\Exception
  168. */
  169. public function checkStatus($orderDay,$orderType) {
  170. // if( !$periodNum ) {
  171. // throw new Exception('期数不能为空');
  172. // }
  173. $periodData = Period::getPeriodFromTime(strtotime($orderDay));
  174. if(!$periodData){
  175. throw new Exception('期数有误');
  176. }
  177. $periodNum = $periodData['PERIOD_NUM'];
  178. //检查是否已经导入过了
  179. //$excelPeriodData = ExcelOrderShop::find()->where('PERIOD_NUM=:PERIOD_NUM', [':PERIOD_NUM'=>$periodNum])->asArray()->one();
  180. if($orderType=='cash'){
  181. $ot = 'FX';
  182. }else{
  183. $ot = 'PT';
  184. }
  185. $excelPeriodData = ExcelOrderShop::find()->where("ORDER_DAY=:ORDER_DAY AND ORDER_TYPE=:ORDER_TYPE", [':ORDER_DAY'=>$orderDay,':ORDER_TYPE'=>$ot])->asArray()->one();
  186. if( !$excelPeriodData ) {
  187. ExcelOrderShop::insertOne(
  188. [
  189. 'ID' => SnowFake::instance()->generateId(),
  190. 'PERIOD_NUM' => $periodNum,
  191. 'ORDER_DAY' => $orderDay,
  192. 'ORDER_TYPE' => $ot,
  193. 'STATUS' => 0,
  194. 'CREATED_AT' => Date::nowTime(),
  195. ]
  196. );
  197. }
  198. // if( $excelPeriodData['STATUS'] == 1 ) {
  199. // throw new Exception(sprintf('%s订单已经导入过了,不可以重复导入', $orderDay));
  200. // }
  201. //清空已经导入的数据
  202. $this->_clearPeriodOrder($orderDay,$orderType);
  203. }
  204. protected function _clearPeriodOrder($orderDay,$orderType) {
  205. OrderShop::pageDeleteAll("ORDER_DAY='".$orderDay."' and PAY_TYPE='".$orderType."'");
  206. OrderGoodsShop::pageDeleteAll("ORDER_DAY='".$orderDay."' and PAY_TYPE='".$orderType."'");
  207. }
  208. public function finished($orderDay,$orderType) {
  209. if( !$orderDay ) return false;
  210. if($orderType=='cash'){
  211. $ot = 'FX';
  212. }else{
  213. $ot = 'PT';
  214. }
  215. ExcelOrderShop::updateAll(['STATUS' => 1], "ORDER_DAY=:ORDER_DAY AND ORDER_TYPE=:ORDER_TYPE", [':ORDER_DAY'=>$orderDay,':ORDER_TYPE'=>$ot]);
  216. return true;
  217. }
  218. public function excelTime($orderDay,$format='Y-m-d H:i:s') {
  219. if(is_numeric($orderDay)){
  220. $t1 = intval(($orderDay - 25569) * 3600 * 24);
  221. $orderDay=gmdate($format,$t1);
  222. }
  223. return $orderDay;
  224. }
  225. }