| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- <?php
- namespace app\modules\alliance\models\agentStaff;
- use app\models\Admin;
- use app\models\AgentFrontCentralizeGoods;
- use app\models\AgentFrontCentralizeGoodsExt;
- use app\models\AgentFrontStaff;
- use app\models\AgentFrontStaffOperateLog;
- use app\models\Driver;
- use app\models\DriverLine;
- use app\models\DriverLineOrder;
- use app\models\DriverMdBind;
- use app\models\Md;
- use app\models\SaasUser;
- use app\models\Supplier;
- use yii\base\Model;
- class SortingGoodsForm extends Model
- {
- public $admin_id;
- public $staff_id;
- public $driver_id;
- public $goods_no;
- public $goods_name;
- public $keyword;
- public $type;//0待分拣 1我分过
- public $id;
- public $params;
- public $status;
- public $centralize_goods_type;
- public function rules()
- {
- return [
- [['admin_id', 'type', 'id', 'status', 'centralize_goods_type'], 'integer'],
- [['goods_no', 'goods_name', 'keyword', 'params'], 'string']
- ];
- }
- //获取待分拣列表
- public function sortingList() {
- $admin_id = $this->admin_id;
- $staff_id = $this->staff_id;
- $keyword = $this->keyword;
- $centralize_goods_type = $this->centralize_goods_type;
- $query = AgentFrontCentralizeGoods::find()->alias('a')
- ->leftJoin(['s' => Supplier::tableName()], 's.cloud_supplier_id = a.supplier_id AND s.is_delete = 0')
- ->where(['a.is_delete' => 0, 'front_admin_id' => $admin_id])
- ->andWhere(['>', 'a.goods_num', 0]);
- if (is_numeric($centralize_goods_type) && in_array($centralize_goods_type, [0, 1])) {
- $query->andWhere(['a.centralize_goods_type' => $centralize_goods_type]);
- }
- // if (!empty(trim($goods_no))) {
- // $query->andWhere(['LIKE', 'a.goods_no', trim($goods_no)]);
- // }
- if (!empty(trim($keyword))) {
- $query->andWhere(['OR', ['LIKE', 'a.goods_name', trim($keyword)], ['LIKE', 'a.goods_no', trim($keyword)]]);
- }
- if (intval($this->type)) {
- //查分拣记录
- $driverLineOrderId = AgentFrontStaffOperateLog::find()->where(['operate_type' => AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING, 'staff_id' => $staff_id])
- ->select('type_id')->column();
- // $centralize_goods_id = DriverLineOrder::find()->where(['id' => $driverLineOrderId])->select('centralize_goods_id')->column();
- $query->leftJoin(['ae' => AgentFrontCentralizeGoodsExt::tableName()], 'ae.centralize_goods_id = a.id');
- $query->leftJoin(['dlo' => DriverLineOrder::tableName()], 'dlo.centralize_goods_ext_id = ae.id');
- $query->leftJoin(['log' => AgentFrontStaffOperateLog::tableName()], 'log.type_id = dlo.id AND log.operate_type = ' . AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING );
- $query->andWhere(['dlo.id' => $driverLineOrderId]);
- $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');
- } else {
- $query->andWhere('a.goods_num > a.sorting_num')->andWhere(['a.status' => AgentFrontCentralizeGoods::STATUS_SORTING]);
- $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');
- }
- $query->groupBy('a.id');
- $query->orderBy(['a.id' => SORT_DESC]);
- $line_query = clone $query;
- // $sql = $query->groupBy('a.id')->orderBy(['a.id' => SORT_DESC])->createCommand()->getRawSql();
- $list = pagination_make($query);
- // $list['sql'] = $sql;
- foreach ($list['list'] as &$item) {
- $item['centralize_goods_type'] = intval($item['centralize_goods_type']);
- $item['attr_info'] = json_decode($item['attr_info'], true);
- $item['order_num'] = AgentFrontCentralizeGoodsExt::find()->where(['centralize_goods_id' => $item['id'], 'is_delete' => 0])
- ->select('goods_num')->sum('goods_num');//这里是下单数量 后期可能需要改动
- $item['num'] = $item['goods_num'] - $item['sorting_num'];
- if (isset($item['created_at'])) {
- $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
- }
- }
- // $query = AgentFrontCentralizeGoods::find()->alias('a')
- // ->leftJoin(['ae' => AgentFrontCentralizeGoodsExt::tableName()], 'ae.centralize_goods_id = a.id')
- // ->where(['a.is_delete' => 0, 'a.front_admin_id' => $admin_id]);
- //
- // if (intval($this->type)) {
- // $driverLineOrderInfoArr = [];
- //
- // $type_id_arr = AgentFrontStaffOperateLog::find()->where(['operate_type' => AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING,
- // 'staff_id' => $staff_id])->select('type_id')->column();
- //// if ($type_id_arr) {
- //// $driverLineOrderInfoArr = DriverLineOrder::find()->where(['id' => $type_id_arr])
- //// ->select('centralize_goods_ext_id')->column();
- //// }
- //// if (!empty($driverLineOrderInfoArr)) {
- //// $query->andWhere(['ae.id' => $driverLineOrderInfoArr]);
- //// }
- // $query->leftJoin(['dlo' => DriverLineOrder::tableName()], 'dlo.centralize_goods_ext_id = ae.id');
- // $query->andWhere(['dlo.id' => $type_id_arr]);
- // $query->select('ae.goods_num as goods_num, dlo.goods_num as sorting_num, a.centralize_goods_type');
- // } else {
- // $query->andWhere(['ae.status' => AgentFrontCentralizeGoodsExt::STATUS_WAIT_SORTING, 'a.status' => AgentFrontCentralizeGoods::STATUS_SORTING])
- // ->select('ae.goods_num as goods_num, ae.sorting_num as sorting_num, a.centralize_goods_type');
- // }
- $list['goods_sql'] = $line_query->createCommand()->getRawSql();
- $agentFrontCentralizeGoods = $line_query->asArray()->all();
- $list['md_goods'] = [
- 'goods_num' => 0,
- 'sorting_num' => 0,
- ];
- $list['line_goods'] = [
- 'goods_num' => 0,
- 'sorting_num' => 0,
- ];
- $list['agent_front_name'] = Admin::findOne($admin_id)->name;
- foreach ($agentFrontCentralizeGoods as $goods_item) {
- if ($goods_item['centralize_goods_type']) {
- $list['md_goods']['goods_num'] += $goods_item['goods_num'] ?? 0;
- $list['md_goods']['sorting_num'] += $goods_item['sorting_num'] ?? 0;
- } else {
- $list['line_goods']['goods_num'] += $goods_item['goods_num'] ?? 0;
- $list['line_goods']['sorting_num'] += $goods_item['sorting_num'] ?? 0;
- }
- }
- return [
- 'code' => 0,
- 'msg' => '',
- 'data' => $list
- ];
- }
- //获取单品分拣
- public function getSortingGoodsDetail() {
- $id = $this->id;
- if (empty($id)) {
- return [
- 'code' => 1,
- 'msg' => '参数错误'
- ];
- }
- $info = AgentFrontCentralizeGoods::find()->where(['id' => $id])
- ->select('goods_name, pic_url, goods_num, sorting_num, attr_info, goods_no, centralize_goods_type')->asArray()->one();
- $query = AgentFrontCentralizeGoodsExt::find()->alias('a')
- ->leftJoin(['c' => AgentFrontCentralizeGoods::tableName()], 'a.centralize_goods_id = c.id')
- ->leftJoin(['md' => Md::tableName()], 'a.md_id = md.id')
- ->leftJoin(['mdb' => DriverMdBind::tableName()], 'a.md_id = mdb.md_id AND mdb.is_delete = 0')
- ->leftJoin(['d' => Driver::tableName()], 'mdb.driver_id = d.id')
- ->where(['a.centralize_goods_id' => $id, 'a.is_delete' => 0, 'a.status' => AgentFrontCentralizeGoodsExt::STATUS_WAIT_SORTING]);
- if (!intval($info['centralize_goods_type'])) {//线货
- $query->groupBy('d.id')->select('GROUP_CONCAT(a.id) as id,
- 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,
- c.attr_info, d.line_name, SUM(a.pre_sorting_num) as pre_sorting_num, a.md_id')->orderBy('a.id DESC');
- } else {//团货
- $query->select('a.id, a.goods_num, a.sorting_num, c.goods_name, c.pic_url, c.goods_no, c.centralize_goods_type,
- c.attr_info, d.line_name, a.pre_sorting_num, a.md_id, a.sort_key')->orderBy('a.sort_key ASC');
- }
- $list = pagination_make($query);
- foreach ($list['list'] as &$item) {
- $item['centralize_goods_type'] = intval($item['centralize_goods_type']);
- $item['attr_info'] = json_decode($item['attr_info'], true);
- $item['num'] = $item['goods_num'] - $item['sorting_num'];//待分拣数量
- // $item['order_num'] = $item['goods_num'];//这里是下单数量 后期可能需要改动
- $item['line_name'] = $item['line_name'] ?? '未绑定线路';
- $item['md_name'] = Md::findOne($item['md_id'])->name ?? '';
- if (!empty($item['sort_key'])) {
- $item['md_name'] = $item['md_name'] . '[团货' . $item['sort_key'] . ']';
- }
- }
- $info['attr_info'] = json_decode($info['attr_info'], true);
- $info['centralize_goods_type'] = intval($info['centralize_goods_type']);
- $list['info'] = $info;
- return [
- 'code' => 0,
- 'msg' => '',
- 'data' => $list
- ];
- }
- /**
- * 提交进度
- */
- public function submitSorting() {
- try {
- $params = json_decode($this->params, true);
- foreach ($params as $item) {
- $agentFrontCentralizeGoodsExt = AgentFrontCentralizeGoodsExt::findOne(['id' => $item['id'], 'status' => AgentFrontCentralizeGoodsExt::STATUS_WAIT_SORTING]);
- if (!$agentFrontCentralizeGoodsExt) {
- throw new \Exception('部分产品已经分拣完成');
- }
- if ($item['num'] > ($agentFrontCentralizeGoodsExt->goods_num - $agentFrontCentralizeGoodsExt->sorting_num)) {
- throw new \Exception('分拣数量超出可分拣数量');
- }
- $agentFrontCentralizeGoodsExt->pre_sorting_num = $item['num'];
- if (!$agentFrontCentralizeGoodsExt->save()) {
- throw new \Exception(implode(';', array_values($agentFrontCentralizeGoodsExt->firstErrors)));
- }
- }
- return [
- 'code' => 0,
- 'msg' => '提交成功'
- ];
- } catch (\Exception $e) {
- return [
- 'code' => 1,
- 'msg' => $e->getMessage()
- ];
- }
- }
- //商品查询
- public function searchGoods() {
- $keyword = $this->keyword;
- $admin_id = $this->admin_id;
- $centralize_goods_type = $this->centralize_goods_type;
- $query = AgentFrontCentralizeGoods::find()->where(['front_admin_id' => $admin_id, 'is_delete' => 0]);
- if (!empty(trim($keyword))) {
- $query->andWhere(['OR', ['LIKE', 'goods_name', trim($keyword)], ['LIKE', 'goods_no', trim($keyword)]]);
- }
- if (is_numeric($centralize_goods_type) && in_array($centralize_goods_type, [0, 1])) {
- $query->andWhere(['a.centralize_goods_type' => $centralize_goods_type]);
- }
- $query->select('id, goods_name, attr_info, goods_no, goods_num, sorting_num, pic_url, created_at')->orderBy('id DESC');
- $list = pagination_make($query);
- foreach ($list['list'] as &$item) {
- $item['md_count'] = AgentFrontCentralizeGoodsExt::find()->where(['centralize_goods_id' => $item['id'], 'is_delete' => 0])
- ->groupBy('md_id')->count();
- $item['attr_info'] = json_decode($item['attr_info'], true);
- $driverLineOrder = DriverLineOrder::find()->where(['centralize_goods_id' => $item['id']])->orderBy('id DESC')
- ->select('created_at')->asArray()->one();
- if ($driverLineOrder) {
- $item['created_at'] = date('Y-m-d H:i:s', $driverLineOrder['created_at']);
- } else {
- $item['created_at'] = '暂未分拣';
- }
- }
- return [
- 'code' => 0,
- 'msg' => '',
- 'data' => $list
- ];
- }
- //商品详情
- public function goodsDetail() {
- $id = $this->id;
- $driver_id = $this->driver_id;
- if (!$id) {
- return [
- 'code' => 1,
- 'msg' => '缺少参数'
- ];
- }
- $keyword = $this->keyword;
- $status = $this->status;
- $query = AgentFrontCentralizeGoodsExt::find()->alias('a');
- $query->leftJoin(['md' => Md::tableName()], 'a.md_id = md.id');
- $query->leftJoin(['do' => DriverLineOrder::tableName()], 'a.id = do.centralize_goods_ext_id');
- $query->leftJoin(['dl' => DriverLine::tableName()], 'dl.id = do.line_id');
- $query->where(['a.centralize_goods_id' => $id, 'a.is_delete' => 0])->andWhere(['>', 'a.md_id', 0]);
- if (!empty(trim($keyword))) {
- $query->andWhere(['OR', ['LIKE', 'md.name', trim($keyword)], ['LIKE', 'do.line_no', trim($keyword)]]);
- }
- if ($status !== null && $status !== '' && in_array($status, [DriverLine::STATUS_WAIT, DriverLine::STATUS_FINISH])) {
- $query->andWhere(['do.status' => $status]);
- }
- if ($driver_id) {
- $query->andWhere(['dl.driver_id' => $driver_id]);
- }
- $query->select('a.id, a.goods_num, a.sorting_num, md.name, md.mobile, do.status, do.created_at');
- $list = pagination_make($query);
- foreach ($list['list'] as &$item) {
- $item['status'] = intval($item['status']);
- $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
- }
- $agentFrontCentralizeGoods = AgentFrontCentralizeGoods::find()->where(['id' => $id])
- ->select('id, goods_name, attr_info, goods_no, pic_url')->asArray()->one();
- if ($agentFrontCentralizeGoods) {
- $agentFrontCentralizeGoodsExt = AgentFrontCentralizeGoodsExt::find()->where(['centralize_goods_id' => $agentFrontCentralizeGoods['id']])
- ->select('created_at')->orderBy('id desc')->asArray()->one();
- $driverLineOrder = DriverLineOrder::find()->where(['centralize_goods_id' => $agentFrontCentralizeGoods['id']])->orderBy('id DESC')
- ->select('created_at')->asArray()->one();
- if ($driverLineOrder) {
- $agentFrontCentralizeGoods['created_at'] = date('Y-m-d H:i:s', $driverLineOrder['created_at']);
- } else {
- $agentFrontCentralizeGoods['created_at'] = '暂未分拣';
- }
- $agentFrontCentralizeGoods['attr_info'] = json_decode($agentFrontCentralizeGoods['attr_info'], true);
- }
- $list['goods_info'] = $agentFrontCentralizeGoods;
- return [
- 'code' => 0,
- 'msg' => '',
- 'data' => $list
- ];
- }
- //获取单品分拣记录
- public function getGoodsSortingRecord() {
- try {
- $id = $this->id;
- $driverLineOrder = DriverLineOrder::find()->where(['centralize_goods_id' => $id])->select('id, goods_num')
- ->asArray()->all();
- $data = [];
- foreach ($driverLineOrder as $index => $item) {
- $data[$index]['goods_num'] = $item['goods_num'];
- $log = AgentFrontStaffOperateLog::findOne([
- 'operate_type' => AgentFrontStaffOperateLog::OPERATE_TYPE_GOODS_SORTING,
- 'type_id' => $item['id']
- ]);
- $data[$index]['created_at'] = date('Y-m-d H:i:s', $log->created_at);
- $admin = Admin::findOne($log->front_agent_admin_id);
- $data[$index]['nickname'] = $admin->name;
- if ($log->staff_id) {
- $staff = AgentFrontStaff::findOne($log->staff_id);
- if ($staff) {
- $saasUser = SaasUser::findOne($staff->saas_id);
- if ($saasUser) {
- $data[$index]['nickname'] = $saasUser->name;
- }
- }
- }
- }
- return [
- 'code' => 0,
- 'msg' => '',
- 'data' => $data
- ];
- } catch (\Exception $e) {
- return [
- 'code' => 1,
- 'msg' => $e->getMessage()
- ];
- }
- }
- }
|