SortingGoodsForm.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <?php
  2. namespace app\modules\alliance\models\agentStaff;
  3. use app\models\Admin;
  4. use app\models\AgentFrontCentralizeGoods;
  5. use app\models\AgentFrontCentralizeGoodsExt;
  6. use app\models\AgentFrontStaff;
  7. use app\models\AgentFrontStaffOperateLog;
  8. use app\models\Driver;
  9. use app\models\DriverLine;
  10. use app\models\DriverLineOrder;
  11. use app\models\DriverMdBind;
  12. use app\models\Md;
  13. use app\models\SaasUser;
  14. use app\models\Supplier;
  15. use yii\base\Model;
  16. class SortingGoodsForm extends Model
  17. {
  18. public $admin_id;
  19. public $staff_id;
  20. public $driver_id;
  21. public $goods_no;
  22. public $goods_name;
  23. public $keyword;
  24. public $type;//0待分拣 1我分过
  25. public $id;
  26. public $params;
  27. public $status;
  28. public $centralize_goods_type;
  29. public function rules()
  30. {
  31. return [
  32. [['admin_id', 'type', 'id', 'status', 'centralize_goods_type'], 'integer'],
  33. [['goods_no', 'goods_name', 'keyword', 'params'], 'string']
  34. ];
  35. }
  36. //获取待分拣列表
  37. public function sortingList() {
  38. $admin_id = $this->admin_id;
  39. $staff_id = $this->staff_id;
  40. $keyword = $this->keyword;
  41. $centralize_goods_type = $this->centralize_goods_type;
  42. $query = AgentFrontCentralizeGoods::find()->alias('a')
  43. ->leftJoin(['s' => Supplier::tableName()], 's.cloud_supplier_id = a.supplier_id AND s.is_delete = 0')
  44. ->where(['a.is_delete' => 0, 'front_admin_id' => $admin_id])
  45. ->andWhere(['>', 'a.goods_num', 0]);
  46. if (is_numeric($centralize_goods_type) && in_array($centralize_goods_type, [0, 1])) {
  47. $query->andWhere(['a.centralize_goods_type' => $centralize_goods_type]);
  48. }
  49. // if (!empty(trim($goods_no))) {
  50. // $query->andWhere(['LIKE', 'a.goods_no', trim($goods_no)]);
  51. // }
  52. if (!empty(trim($keyword))) {
  53. $query->andWhere(['OR', ['LIKE', 'a.goods_name', trim($keyword)], ['LIKE', 'a.goods_no', trim($keyword)]]);
  54. }
  55. if (intval($this->type)) {
  56. //查分拣记录
  57. $driverLineOrderId = AgentFrontStaffOperateLog::find()->where(['operate_type' => AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING, 'staff_id' => $staff_id])
  58. ->select('type_id')->column();
  59. // $centralize_goods_id = DriverLineOrder::find()->where(['id' => $driverLineOrderId])->select('centralize_goods_id')->column();
  60. $query->leftJoin(['ae' => AgentFrontCentralizeGoodsExt::tableName()], 'ae.centralize_goods_id = a.id');
  61. $query->leftJoin(['dlo' => DriverLineOrder::tableName()], 'dlo.centralize_goods_ext_id = ae.id');
  62. $query->leftJoin(['log' => AgentFrontStaffOperateLog::tableName()], 'log.type_id = dlo.id AND log.operate_type = ' . AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING );
  63. $query->andWhere(['dlo.id' => $driverLineOrderId]);
  64. $query->select('a.goods_name, a.pic_url, a.goods_no, a.centralize_goods_type, a.goods_num as goods_num, a.sorting_num as a_sorting_num, a.attr_info, SUM(dlo.goods_num) as sorting_num, MAX(log.created_at) as created_at');
  65. } else {
  66. $query->andWhere('a.goods_num > a.sorting_num')->andWhere(['a.status' => AgentFrontCentralizeGoods::STATUS_SORTING]);
  67. $query->select('a.id,a.goods_name, a.pic_url, a.goods_no, a.centralize_goods_type, a.goods_num, a.attr_info, a.sorting_num');
  68. }
  69. $query->groupBy('a.id');
  70. $query->orderBy(['a.id' => SORT_DESC]);
  71. $line_query = clone $query;
  72. // $sql = $query->groupBy('a.id')->orderBy(['a.id' => SORT_DESC])->createCommand()->getRawSql();
  73. $list = pagination_make($query);
  74. // $list['sql'] = $sql;
  75. foreach ($list['list'] as &$item) {
  76. $item['centralize_goods_type'] = intval($item['centralize_goods_type']);
  77. $item['attr_info'] = json_decode($item['attr_info'], true);
  78. $item['order_num'] = AgentFrontCentralizeGoodsExt::find()->where(['centralize_goods_id' => $item['id'], 'is_delete' => 0])
  79. ->select('goods_num')->sum('goods_num');//这里是下单数量 后期可能需要改动
  80. $item['num'] = $item['goods_num'] - $item['sorting_num'];
  81. if (isset($item['created_at'])) {
  82. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  83. }
  84. }
  85. // $query = AgentFrontCentralizeGoods::find()->alias('a')
  86. // ->leftJoin(['ae' => AgentFrontCentralizeGoodsExt::tableName()], 'ae.centralize_goods_id = a.id')
  87. // ->where(['a.is_delete' => 0, 'a.front_admin_id' => $admin_id]);
  88. //
  89. // if (intval($this->type)) {
  90. // $driverLineOrderInfoArr = [];
  91. //
  92. // $type_id_arr = AgentFrontStaffOperateLog::find()->where(['operate_type' => AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING,
  93. // 'staff_id' => $staff_id])->select('type_id')->column();
  94. //// if ($type_id_arr) {
  95. //// $driverLineOrderInfoArr = DriverLineOrder::find()->where(['id' => $type_id_arr])
  96. //// ->select('centralize_goods_ext_id')->column();
  97. //// }
  98. //// if (!empty($driverLineOrderInfoArr)) {
  99. //// $query->andWhere(['ae.id' => $driverLineOrderInfoArr]);
  100. //// }
  101. // $query->leftJoin(['dlo' => DriverLineOrder::tableName()], 'dlo.centralize_goods_ext_id = ae.id');
  102. // $query->andWhere(['dlo.id' => $type_id_arr]);
  103. // $query->select('ae.goods_num as goods_num, dlo.goods_num as sorting_num, a.centralize_goods_type');
  104. // } else {
  105. // $query->andWhere(['ae.status' => AgentFrontCentralizeGoodsExt::STATUS_WAIT_SORTING, 'a.status' => AgentFrontCentralizeGoods::STATUS_SORTING])
  106. // ->select('ae.goods_num as goods_num, ae.sorting_num as sorting_num, a.centralize_goods_type');
  107. // }
  108. $list['goods_sql'] = $line_query->createCommand()->getRawSql();
  109. $agentFrontCentralizeGoods = $line_query->asArray()->all();
  110. $list['md_goods'] = [
  111. 'goods_num' => 0,
  112. 'sorting_num' => 0,
  113. ];
  114. $list['line_goods'] = [
  115. 'goods_num' => 0,
  116. 'sorting_num' => 0,
  117. ];
  118. $list['agent_front_name'] = Admin::findOne($admin_id)->name;
  119. foreach ($agentFrontCentralizeGoods as $goods_item) {
  120. if ($goods_item['centralize_goods_type']) {
  121. $list['md_goods']['goods_num'] += $goods_item['goods_num'] ?? 0;
  122. $list['md_goods']['sorting_num'] += $goods_item['sorting_num'] ?? 0;
  123. } else {
  124. $list['line_goods']['goods_num'] += $goods_item['goods_num'] ?? 0;
  125. $list['line_goods']['sorting_num'] += $goods_item['sorting_num'] ?? 0;
  126. }
  127. }
  128. return [
  129. 'code' => 0,
  130. 'msg' => '',
  131. 'data' => $list
  132. ];
  133. }
  134. //获取单品分拣
  135. public function getSortingGoodsDetail() {
  136. $id = $this->id;
  137. if (empty($id)) {
  138. return [
  139. 'code' => 1,
  140. 'msg' => '参数错误'
  141. ];
  142. }
  143. $info = AgentFrontCentralizeGoods::find()->where(['id' => $id])
  144. ->select('goods_name, pic_url, goods_num, sorting_num, attr_info, goods_no, centralize_goods_type')->asArray()->one();
  145. $query = AgentFrontCentralizeGoodsExt::find()->alias('a')
  146. ->leftJoin(['c' => AgentFrontCentralizeGoods::tableName()], 'a.centralize_goods_id = c.id')
  147. ->leftJoin(['md' => Md::tableName()], 'a.md_id = md.id')
  148. ->leftJoin(['mdb' => DriverMdBind::tableName()], 'a.md_id = mdb.md_id AND mdb.is_delete = 0')
  149. ->leftJoin(['d' => Driver::tableName()], 'mdb.driver_id = d.id')
  150. ->where(['a.centralize_goods_id' => $id, 'a.is_delete' => 0, 'a.status' => AgentFrontCentralizeGoodsExt::STATUS_WAIT_SORTING]);
  151. if (!intval($info['centralize_goods_type'])) {//线货
  152. $query->groupBy('d.id')->select('GROUP_CONCAT(a.id) as id,
  153. SUM(a.goods_num) as goods_num, SUM(a.sorting_num) as sorting_num, c.goods_name, c.pic_url, c.goods_no, c.centralize_goods_type,
  154. c.attr_info, d.line_name, SUM(a.pre_sorting_num) as pre_sorting_num, a.md_id')->orderBy('a.id DESC');
  155. } else {//团货
  156. $query->select('a.id, a.goods_num, a.sorting_num, c.goods_name, c.pic_url, c.goods_no, c.centralize_goods_type,
  157. c.attr_info, d.line_name, a.pre_sorting_num, a.md_id, a.sort_key')->orderBy('a.sort_key ASC');
  158. }
  159. $list = pagination_make($query);
  160. foreach ($list['list'] as &$item) {
  161. $item['centralize_goods_type'] = intval($item['centralize_goods_type']);
  162. $item['attr_info'] = json_decode($item['attr_info'], true);
  163. $item['num'] = $item['goods_num'] - $item['sorting_num'];//待分拣数量
  164. // $item['order_num'] = $item['goods_num'];//这里是下单数量 后期可能需要改动
  165. $item['line_name'] = $item['line_name'] ?? '未绑定线路';
  166. $item['md_name'] = Md::findOne($item['md_id'])->name ?? '';
  167. if (!empty($item['sort_key'])) {
  168. $item['md_name'] = $item['md_name'] . '[团货' . $item['sort_key'] . ']';
  169. }
  170. }
  171. $info['attr_info'] = json_decode($info['attr_info'], true);
  172. $info['centralize_goods_type'] = intval($info['centralize_goods_type']);
  173. $list['info'] = $info;
  174. return [
  175. 'code' => 0,
  176. 'msg' => '',
  177. 'data' => $list
  178. ];
  179. }
  180. /**
  181. * 提交进度
  182. */
  183. public function submitSorting() {
  184. try {
  185. $params = json_decode($this->params, true);
  186. foreach ($params as $item) {
  187. $agentFrontCentralizeGoodsExt = AgentFrontCentralizeGoodsExt::findOne(['id' => $item['id'], 'status' => AgentFrontCentralizeGoodsExt::STATUS_WAIT_SORTING]);
  188. if (!$agentFrontCentralizeGoodsExt) {
  189. throw new \Exception('部分产品已经分拣完成');
  190. }
  191. if ($item['num'] > ($agentFrontCentralizeGoodsExt->goods_num - $agentFrontCentralizeGoodsExt->sorting_num)) {
  192. throw new \Exception('分拣数量超出可分拣数量');
  193. }
  194. $agentFrontCentralizeGoodsExt->pre_sorting_num = $item['num'];
  195. if (!$agentFrontCentralizeGoodsExt->save()) {
  196. throw new \Exception(implode(';', array_values($agentFrontCentralizeGoodsExt->firstErrors)));
  197. }
  198. }
  199. return [
  200. 'code' => 0,
  201. 'msg' => '提交成功'
  202. ];
  203. } catch (\Exception $e) {
  204. return [
  205. 'code' => 1,
  206. 'msg' => $e->getMessage()
  207. ];
  208. }
  209. }
  210. //商品查询
  211. public function searchGoods() {
  212. $keyword = $this->keyword;
  213. $admin_id = $this->admin_id;
  214. $centralize_goods_type = $this->centralize_goods_type;
  215. $query = AgentFrontCentralizeGoods::find()->where(['front_admin_id' => $admin_id, 'is_delete' => 0]);
  216. if (!empty(trim($keyword))) {
  217. $query->andWhere(['OR', ['LIKE', 'goods_name', trim($keyword)], ['LIKE', 'goods_no', trim($keyword)]]);
  218. }
  219. if (is_numeric($centralize_goods_type) && in_array($centralize_goods_type, [0, 1])) {
  220. $query->andWhere(['a.centralize_goods_type' => $centralize_goods_type]);
  221. }
  222. $query->select('id, goods_name, attr_info, goods_no, goods_num, sorting_num, pic_url, created_at')->orderBy('id DESC');
  223. $list = pagination_make($query);
  224. foreach ($list['list'] as &$item) {
  225. $item['md_count'] = AgentFrontCentralizeGoodsExt::find()->where(['centralize_goods_id' => $item['id'], 'is_delete' => 0])
  226. ->groupBy('md_id')->count();
  227. $item['attr_info'] = json_decode($item['attr_info'], true);
  228. $driverLineOrder = DriverLineOrder::find()->where(['centralize_goods_id' => $item['id']])->orderBy('id DESC')
  229. ->select('created_at')->asArray()->one();
  230. if ($driverLineOrder) {
  231. $item['created_at'] = date('Y-m-d H:i:s', $driverLineOrder['created_at']);
  232. } else {
  233. $item['created_at'] = '暂未分拣';
  234. }
  235. }
  236. return [
  237. 'code' => 0,
  238. 'msg' => '',
  239. 'data' => $list
  240. ];
  241. }
  242. //商品详情
  243. public function goodsDetail() {
  244. $id = $this->id;
  245. $driver_id = $this->driver_id;
  246. if (!$id) {
  247. return [
  248. 'code' => 1,
  249. 'msg' => '缺少参数'
  250. ];
  251. }
  252. $keyword = $this->keyword;
  253. $status = $this->status;
  254. $query = AgentFrontCentralizeGoodsExt::find()->alias('a');
  255. $query->leftJoin(['md' => Md::tableName()], 'a.md_id = md.id');
  256. $query->leftJoin(['do' => DriverLineOrder::tableName()], 'a.id = do.centralize_goods_ext_id');
  257. $query->leftJoin(['dl' => DriverLine::tableName()], 'dl.id = do.line_id');
  258. $query->where(['a.centralize_goods_id' => $id, 'a.is_delete' => 0])->andWhere(['>', 'a.md_id', 0]);
  259. if (!empty(trim($keyword))) {
  260. $query->andWhere(['OR', ['LIKE', 'md.name', trim($keyword)], ['LIKE', 'do.line_no', trim($keyword)]]);
  261. }
  262. if ($status !== null && $status !== '' && in_array($status, [DriverLine::STATUS_WAIT, DriverLine::STATUS_FINISH])) {
  263. $query->andWhere(['do.status' => $status]);
  264. }
  265. if ($driver_id) {
  266. $query->andWhere(['dl.driver_id' => $driver_id]);
  267. }
  268. $query->select('a.id, a.goods_num, a.sorting_num, md.name, md.mobile, do.status, do.created_at');
  269. $list = pagination_make($query);
  270. foreach ($list['list'] as &$item) {
  271. $item['status'] = intval($item['status']);
  272. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  273. }
  274. $agentFrontCentralizeGoods = AgentFrontCentralizeGoods::find()->where(['id' => $id])
  275. ->select('id, goods_name, attr_info, goods_no, pic_url')->asArray()->one();
  276. if ($agentFrontCentralizeGoods) {
  277. $agentFrontCentralizeGoodsExt = AgentFrontCentralizeGoodsExt::find()->where(['centralize_goods_id' => $agentFrontCentralizeGoods['id']])
  278. ->select('created_at')->orderBy('id desc')->asArray()->one();
  279. $driverLineOrder = DriverLineOrder::find()->where(['centralize_goods_id' => $agentFrontCentralizeGoods['id']])->orderBy('id DESC')
  280. ->select('created_at')->asArray()->one();
  281. if ($driverLineOrder) {
  282. $agentFrontCentralizeGoods['created_at'] = date('Y-m-d H:i:s', $driverLineOrder['created_at']);
  283. } else {
  284. $agentFrontCentralizeGoods['created_at'] = '暂未分拣';
  285. }
  286. $agentFrontCentralizeGoods['attr_info'] = json_decode($agentFrontCentralizeGoods['attr_info'], true);
  287. }
  288. $list['goods_info'] = $agentFrontCentralizeGoods;
  289. return [
  290. 'code' => 0,
  291. 'msg' => '',
  292. 'data' => $list
  293. ];
  294. }
  295. //获取单品分拣记录
  296. public function getGoodsSortingRecord() {
  297. try {
  298. $id = $this->id;
  299. $driverLineOrder = DriverLineOrder::find()->where(['centralize_goods_id' => $id])->select('id, goods_num')
  300. ->asArray()->all();
  301. $data = [];
  302. foreach ($driverLineOrder as $index => $item) {
  303. $data[$index]['goods_num'] = $item['goods_num'];
  304. $log = AgentFrontStaffOperateLog::findOne([
  305. 'operate_type' => AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING,
  306. 'type_id' => $item['id']
  307. ]);
  308. $data[$index]['created_at'] = date('Y-m-d H:i:s', $log->created_at);
  309. $admin = Admin::findOne($log->front_agent_admin_id);
  310. $data[$index]['nickname'] = $admin->name;
  311. if ($log->staff_id) {
  312. $staff = AgentFrontStaff::findOne($log->staff_id);
  313. if ($staff) {
  314. $saasUser = SaasUser::findOne($staff->saas_id);
  315. if ($saasUser) {
  316. $data[$index]['nickname'] = $saasUser->name;
  317. }
  318. }
  319. }
  320. }
  321. return [
  322. 'code' => 0,
  323. 'msg' => '',
  324. 'data' => $data
  325. ];
  326. } catch (\Exception $e) {
  327. return [
  328. 'code' => 1,
  329. 'msg' => $e->getMessage()
  330. ];
  331. }
  332. }
  333. }