getFind($where); return $info['name']; } /** * 门店列表 * @param $merchant_id * @param $store_id * @return array */ public function storeList($merchant_id, $store_id) { $where = array( 'merchantid' => $merchant_id, 'state' => 0, 'supplier_type' => 1 ); if (!empty($store_id)) { $where['id'] = array('neq', $store_id); } $store = D('Store')->getSelect($where, "id,storetag"); if (!empty($store_id)) { $map = array( 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'status' => 1 ); $storeSupplier = M('retail_store_supplier')->field("id,supplier_name")->where($map)->order('id desc')->select(); } else { $map = array( 'merchantid' => $merchant_id, 'status' => 1 ); $supplier = M('retail_supplier')->field("id,supplier_name")->where($map)->order('id desc')->select(); } $res = array( 'status' => 1, 'storeList' => $store, 'supplier' => $supplier ? $supplier : array(), 'storeSupplier' => $storeSupplier ? $storeSupplier : array() ); return $res; } /** * 获取一级分类 * @param $merchant_id * @return mixed */ public function GoodsClass($merchant_id) { $class_name = M('retail_goods_class')->where(array('merchantid' => $merchant_id, 'status' => 0, 'type' => 1))->order('code asc')->select(); return $class_name; } /** * 获取商品的规格属性信息 * @param $merchant_id * @return mixed */ public function getSkuAttr($merchant_id) { if (!$merchant_id) { $res['status'] = 0; $res['msg'] = '参数缺失'; return $res; } $skuList = M('retail_sku_attr') ->where(array('merchantid' => $merchant_id, 'status' => 1, 'state' => 0)) ->field('id,name') ->select(); foreach ($skuList as &$val) { $list = M('retail_sku_list') ->where(array('attr_id' => $val['id'], 'status' => 1, 'state' => 0)) ->field('id,name') ->select(); foreach ($list as &$v) { $v['checked'] = false; } $val['list'] = $list; $val['checked'] = false; } $res['status'] = 1; $res['data'] = $skuList; return $res; } /** * 添加规格属性 * @param $name 规格属性名称 * @param $user_type 用户身份 1 商户 0门店 * @param $merchant_id * @param $store_id * @return mixed */ public function addSkuAttr_forAddMGoods($name, $user_type, $merchant_id, $store_id) { if (!empty($merchant_id) && !empty($name)) { $map['merchantid'] = $merchant_id; $map['state'] = 0; $map['name'] = $name; $old = M('retail_sku_attr')->where($map)->find(); if (!empty($old)) { if ($old['status'] == 1) { $res['status'] = 0; $res['msg'] = '已存在同名规格'; } else { $res['status'] = 0; $res['msg'] = '该规格已被您禁用'; } } else { if ($user_type == 1) { //商户 $add['storeid'] = 0; } else { $add['storeid'] = $store_id; } $add = $map; $add['addtime'] = time(); $add['status'] = 1; $id = M('retail_sku_attr')->add($add); if ($id) { $res['status'] = 1; $res['msg'] = '添加成功'; $res['id'] = $id; } else { $res['status'] = 0; $res['msg'] = '服务器出差了'; } } } else { $res['status'] = 0; $res['msg'] = '登录超时'; } return $res; } /** * 添加规格名称的接口 * @param $id 规格属性id * @param $name 规格名称 * @param $user_type 1商户 0门店 * @param $merchant_id * @param $store_id * @return mixed */ public function addSkuList_forAddMGoods($id, $name, $user_type, $merchant_id, $store_id) { if (!empty($merchant_id) && !empty($name) || !empty($id)) { $map['merchantid'] = $merchant_id; $map['state'] = 0; $map['name'] = $name; $map['attr_id'] = $id; $old = M('retail_sku_list')->where($map)->find(); if (!empty($old)) { if ($old['status'] == 1) { $res['status'] = 0; $res['msg'] = '已存在同名规格'; } else { $res['status'] = 0; $res['msg'] = '该规格已被您禁用'; } } else { $add = $map; $add['addtime'] = time(); if ($user_type == 1) { //商户 $add['storeid'] = 0; } else { $add['storeid'] = $store_id; } $add['status'] = 1; $id = M('retail_sku_list')->add($add); if ($id) { $res['status'] = 1; $res['msg'] = '添加成功'; $res['id'] = $id; } else { $res['status'] = 0; $res['msg'] = '服务器出差了'; } } } else { $res['status'] = 0; $res['msg'] = '登录超时'; } return $res; } /* * *************************************门店模块***************************************** */ /** * 门店商品档案新增接口 * @param $goods 商品信息 * @param $type 1 新增 2 编辑 * @return mixed */ public function addSaleGoods($goods, $type) { $SSaleMGoodsModel = new SSaleMGoodsModel(); $SWarehousingGoodsModel = new SWarehousingGoodsModel(); $goods['attribute_state'] = $goods['attribute_state'] ? $goods['attribute_state'] : 1; $goods['pricing_method'] = $goods['pricing_method'] ? $goods['pricing_method'] : 1; $content = [ 'merchant_id' => $goods['merchant_id'], 'store_id' => $goods['store_id'], 'warehouse_id' => $goods['warehouse_id'], 'goods_class_id' => $goods['goods_class_id'], 'goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name'], 'goods_number' => $goods['goods_number'], 'goods_code' => $goods['goods_code'], 'company' => $goods['company'], 'specifications' => $goods['specifications'], 'attribute_state' => $goods['attribute_state'], 'pricing_method' => $goods['pricing_method'], 'goods_brand_id' => $goods['goods_brand_id'], 'goods_yieldly_id' => $goods['goods_yieldly_id'], 'goods_num' => $goods['goods_num'], 'more_num' => $goods['more_num'], 'less_num' => $goods['less_num'], 'status' => $goods['status'] ? $goods['status'] : 0, 'cost_price' => $goods['purchase_price'], 'serial_number_state' => $goods['serial_number_state'] ? $goods['serial_number_state'] : 0, 'third_goods_code' => $goods['third_goods_code'] ? $goods['third_goods_code'] : '' ]; if ($type == 1) { $content['add_time'] = $goods['add_time'] ? $goods['add_time'] : time(); } if ($content['attribute_state'] == 2) { $content['sku_id'] = $goods['sku_id']; $content['sku_name'] = $goods['sku_name']; $content['sku_id_list'] = $goods['sku_id_list']; $content['sku_goods_number'] = $goods['sku_goods_number']; $content['sku_code'] = $goods['sku_code']; $content['sku_num'] = $goods['sku_num']; } if ($type == 2) { $where = [ 'goods_id' => $goods['goods_id'], 'status' => ['in', '0,1'], ]; if ($goods['attribute_state'] == 2) { $where['sku_id'] = $goods['sku_id']; } unset($content['goods_num']); unset($content['cost_price']); unset($content['add_time']); $SSaleMGoodsModel->updateData($where, $content); } else if ($type == 1) { $SSaleMGoodsModel->addData($content); } if ($type == 1) { if ($content['goods_num'] > 0) { //库存大于0存入销售仓库 $content['warehouse_price'] = $content['cost_price']; $content['warehouse_num'] = $content['goods_num']; $content['surplus_num'] = $content['goods_num']; $content['subtotal'] = round($content['warehouse_num'] * $content['warehouse_price'], 2); $content['remarks'] = "初始化库存"; $content['type'] = 7; unset($content['specifications']); unset($content['goods_brand_id']); unset($content['goods_yieldly_id']); unset($content['goods_num']); unset($content['more_num']); unset($content['less_num']); unset($content['status']); unset($content['cost_price']); $res = $SWarehousingGoodsModel->addData($content); if ($res['status'] == 0) { $res['msg'] = "商品初始化库存添加失败"; return $res; } //初始成本价添加 $cost = [ 'merchant_id' => $goods['merchant_id'], 'store_id' => $goods['store_id'], 'cost_price' => $goods['purchase_price'], 'goods_id' => $goods['goods_id'], 'purchase_price' => $goods['purchase_price'], 'goods_class_id' => $goods['goods_class_id'], 'attribute_state' => $goods['attribute_state'], 'pricing_method' => $goods['pricing_method'], 'add_time' => $_SERVER['REQUEST_TIME'] ]; if ($cost['attribute_state'] == 2) { $cost['sku_id'] = $goods['sku_id']; } $SCostPriceRecordModel = new SCostPriceRecordModel(); $res = $SCostPriceRecordModel->addData($cost); if ($res['status'] == 0) { $res['msg'] = '商品成本价添加失败'; return $res; } } else { $res = [ 'status' => 1, 'msg' => '操作成功' ]; } } else if ($type == 2) { $where = [ 'merchant_id' => $content['merchant_id'], 'store_id' => $content['store_id'], 'goods_id' => $content['goods_id'], 'type' => 7 ]; if ($content['attribute_state'] == 2) { $where['sku_id'] = $content['sku_id']; } $res = $SWarehousingGoodsModel->updateData($where, $content); } return $res; } /** * 编辑门店商品初始化入库信息 * @param $data 修改的信息 * @param $store_id 门店id * @param $goods_id 商品id * @param $sku_id 规格id */ public function SalesWarehouse($data, $store_id, $goods_id, $sku_id = null) { $where = array(); $where['store_id'] = $store_id; $where['goods_id'] = $goods_id; $where['type'] = 7; if (!empty($sku_id)) { $where['sku_id'] = $sku_id; } $SWarehousingGoodsModel = new SWarehousingGoodsModel(); $SWarehousingGoodsModel->updateData($where, $data); } /** * 门店商品库存表增加减少 * @param $type 1增加 2减少 * @param $num 操作数量 * @param $goods_id 商品id * @param null $sku_id 规格id * @return mixed */ public function Inventory($type, $num, $goods_id, $sku_id = null) { $where = array(); if (!empty($sku_id)) { $where['sku_id'] = $sku_id; } $where['goods_id'] = $goods_id; $where['status'] = array('in', '0,1'); $saleGoodsModel = new SSaleMGoodsModel(); if ($type == 1) { $success = $saleGoodsModel->updateSetInc($where, "goods_num", $num); } else if ($type == 2) { $success = $saleGoodsModel->updateSetDec($where, "goods_num", $num); } return $success; } /** * 门店获取商品数量 * @param $type 1商品的单库存 2商品的总库存 * @param $store_id 门店id * @param $goods_id 商品id * @param null $sku_id 商品规格id * @return float|int */ public function goods_num($type, $store_id, $goods_id, $sku_id = null) { $where = array(); if (!empty($sku_id)) { $where['sku_id'] = $sku_id; } $where['store_id'] = $store_id; $where['goods_id'] = $goods_id; $where['status'] = array('in', '0,1'); if ($type == 1) { $goods_num = D('SSaleMGoods')->getFindField($where, "goods_num"); } else if ($type == 2) { if (!empty($sku_id)) { unset($where['sku_id']); } $goods_num = D('SSaleMGoods')->getSum($where, "goods_num"); } $goods_num = $goods_num ? round($goods_num, 3) : 0; return $goods_num; } /** * 门店售后订单商家库存增加处理 * @param $parameter * [ * bill_order 订单信息 * ] * @return mixed */ public function CustomerStockInc($parameter) { $bill_order = $parameter['bill_order']; $supplier_type = D("RetailStore")->getFindField(array('id' => $bill_order['store_id']), "supplier_type"); $order_genre = D("RetailBillOnline")->getFindField(array("bill_id" => $bill_order['id']), "order_genre"); switch ($bill_order['order_type']) { case 2: //退款订单 switch ($order_genre) { //1.普通订单 2.拼团订单 3.秒杀订单 4预售订单 case 1: $type = 12; break; case 2: $type = 8; break; case 3: $type = 9; break; case 4: $type = 17; break; } break; case 3: //换货订单 switch ($order_genre) { //1.普通订单 2.拼团订单 3.秒杀订单 case 1: $type = 16; break; case 2: $type = 14; break; case 3: $type = 15; break; case 4: $type = 18; break; } break; } $SellModel = new RetailSellModel(); $sell_list = $SellModel->getSelect(array('bill_id' => $bill_order['id']), "id,goods_id,price,all_money,sku_json_info,num,supplier_json,purchase_id_str,serial_number_state"); if ($sell_list) { $SSaleMGoodsModel = new SSaleMGoodsModel(); $RetailBillOrderModel = new RetailBillOrderModel(); $RetailBillAdvanceModel = new RetailBillAdvanceModel(); $AdvanceGoodsModel = new AdvanceGoodsModel(); $AdvanceSkuGoodsModel = new AdvanceSkuGoodsModel(); $SerialClass = new SerialNumberGoods(); foreach ($sell_list as $value) { $sell_map = array( "goods_id" => $value["goods_id"], ); $sku_id = 0; if (!empty($value["sku_json_info"])) { //规格商品 $sku = json_decode($value["sku_json_info"], true); $sell_map['sku_id'] = $sku['id']; $sku_id = $sku['id']; } switch ($order_genre) { case 1: $SSaleMGoodsModel->updateSetInc($sell_map, "goods_num", $value['num']);//增加库存数量 break; case 4: //预售 $old_bill_id = $RetailBillOrderModel->getFindField(array("order_no" => $bill_order['refund_no']), "id"); $advance_info = $RetailBillAdvanceModel->getFind(array("bill_id" => $old_bill_id)); $parameter = array( 'advance_id' => $advance_info['advance_id'], 'goods_id' => $advance_info['goods_id'], 'num' => $value['num'] ); $AdvanceGoodsModel->StockSetInc($parameter); if (!empty($advance_info['sku_id'])) { $parameter['sku_id'] = $advance_info['sku_id']; $AdvanceSkuGoodsModel->StockSetInc($parameter); } break; } // 添加库存记录并且加库存 if ($supplier_type == 2) { //寄售供货商 $supplier_arr = array( 'supplier_type' => $supplier_type, 'supplier_json' => $value['supplier_json'], 'purchase_id_str' => $value['purchase_id_str'], ); } else { $supplier_arr = array(); } //串号信息 $serial_list = []; if ($value['serial_number_state'] == 1) { $serialResult = $SerialClass->sellSerialList([ 'id' => $value['id'], 'files' => 'main_serial_number,auxiliary_serial_number_one,auxiliary_serial_number_two' ]); $serial_list = $serialResult['data']['list']; } $data = [ 'goods_id' => $value["goods_id"], 'sku_id' => $sku_id, 'num' => $value['num'], 'price' => $value['price'], 'type' => $type, 'all_money' => $value['all_money'], 'supplier_arr' => $supplier_arr, 'serial_list' => $serial_list ]; $this->goodsNumRise($data); } $res['status'] = 1; $res['msg'] = '库存增加成功'; } else { $res['status'] = 0; $res['msg'] = '库存增加失败'; } return $res; } /** * 门店换货订单库存减少处理 * @param $parameter * [ * bill_order 订单信息 * ] * @return mixed */ public function CustomerStockDec($parameter) { $bill_order = $parameter['bill_order']; $RetailBillOnlineModel = new RetailBillOnlineModel(); $order_genre = $RetailBillOnlineModel->getFindField(array("bill_id" => $bill_order['id']), "order_genre"); switch ($bill_order['order_type']) { case 3: //换货订单 switch ($order_genre) { //1.普通订单 2.拼团订单 3.秒杀订单 case 1: $type = 12; break; case 2: $type = 13; break; case 3: $type = 14; break; case 4: $type = 15; break; } break; } $SellModel = new RetailSellModel(); $sellOrder = $SellModel->getSelect(array("bill_id" => $bill_order['id']), "id,goods_id,price,all_money,sku_json_info,num,supplier_json,purchase_id_str,serial_number_state"); $SSaleMGoods = new SSaleMGoodsModel(); $AdvanceGoodsModel = new AdvanceGoodsModel(); $AdvanceSkuGoodsModel = new AdvanceSkuGoodsModel(); $RetailBillOrderModel = new RetailBillOrderModel(); $RetailBillAdvanceModel = new RetailBillAdvanceModel(); $SerialClass = new SerialNumberGoods(); if ($sellOrder) { foreach ($sellOrder as $val) { $sell_map = array( 'goods_id' => $val["goods_id"], ); if (!empty($val["sku_json_info"])) { //规格商品 $sku = json_decode($val["sku_json_info"], true); $sell_map['sku_id'] = $sku['id']; $sku_id = $sku['id']; } else { $sku_id = ''; } // 减少库存 switch ($order_genre) { case 1: $SSaleMGoods->updateSetDec($sell_map, "goods_num", $val['num']); break; case 4: //预售 $old_bill_id = $RetailBillOrderModel->getFindField(array("order_no" => $bill_order['refund_no']), "id"); $advance_info = $RetailBillAdvanceModel->getFind(array("bill_id" => $old_bill_id)); $parameter = array( 'advance_id' => $advance_info['advance_id'], 'goods_id' => $advance_info['goods_id'], 'num' => $val['num'] ); $AdvanceGoodsModel->StockSetDec($parameter); if (!empty($advance_info['sku_id'])) { $parameter['sku_id'] = $advance_info['sku_id']; $AdvanceSkuGoodsModel->StockSetDec($parameter); } break; } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->sellSerialList([ 'id' => $val['id'], 'files' => 'main_serial_number,auxiliary_serial_number_one,auxiliary_serial_number_two', ]); $serial_list = $serialResult['data']['list']; } else { $serial_list = []; } $data = [ 'goods_id' => $val["goods_id"], 'sku_id' => $sku_id, 'stock_price' => $val['price'], 'stock_num' => $val['num'], 'type' => $type, 'all_money' => $val['all_money'], 'serial_list' => $serial_list, ]; $this->goodsNumReduce($data); unset($sell_map); unset($sku_id); } $res['status'] = 1; $res['msg'] = '操作成功'; } else { $res['status'] = 0; $res['msg'] = '操作失败'; } return $res; } /** * 门店商品入库记录表操作(此接口针对 type = 8-21) * @param $param * [ * $goods_id 商品id * $sku_id 规格id * $warehouse_num 入库数量 * $refund_price 退货价 * $type 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6该门店申请调拨入库 7初始化商品档案入库 8拼团订单退货入库 9秒杀订单退货入库 10拆分入库 11收银订单退货入库 12商城正常订单退货入库 13组合入库 14商城换货入库 15秒杀换货入库 16商城普通换货入库 17预售退货入库 18预售换货入库 19收银赠品退货入库 20商城增品退货入库 21调拨拒收入库 * $all_money 该商品入库总价 * array $supplier_arr 寄售供货商采购单信息 * serial_list 串号信息 * ] * @return mixed */ public function goodsNumRise($param) { $goods_id = $param['goods_id']; $sku_id = $param['sku_id']; $warehouse_num = $param['num']; $refund_price = $param['price']; $type = $param['type']; $all_money = $param['all_money']; $supplier_arr = $param['supplier_arr']; $serial_list = $param['serial_list'] ? $param['serial_list'] : []; $time = $_SERVER['REQUEST_TIME']; $where = [ 'goods_id' => $goods_id ]; if (!empty($sku_id)) { $where['sku_id'] = $sku_id; } $SerialClass = new SerialNumberGoods(); $SSaleMGoodsModel = new SSaleMGoodsModel(); $goodsInfo = $SSaleMGoodsModel->getFind($where); unset($goodsInfo['id']); if ($goodsInfo) { $goodsInfo['warehouse_price'] = round($goodsInfo['cost_price'], 2); $goodsInfo['warehouse_num'] = round($warehouse_num, 3); $goodsInfo['surplus_num'] = round($warehouse_num, 3); if ($type == 10 || $type == 13) { $goodsInfo['subtotal'] = round($goodsInfo['warehouse_price'] * $goodsInfo['warehouse_num'], 2); } else if (in_array($type, array(8, 9, 11, 12, 14, 17, 19, 20))) { $goodsInfo['refund_price'] = $refund_price; $goodsInfo['subtotal'] = $all_money; } else { $goodsInfo['refund_price'] = round($refund_price, 2); $goodsInfo['subtotal'] = round($goodsInfo['refund_price'] * $goodsInfo['warehouse_num'], 2); } switch ($type) { case 8: $goodsInfo['remarks'] = "拼团退货入库"; break; case 9: $goodsInfo['remarks'] = "秒杀退货入库"; break; case 10: $goodsInfo['remarks'] = "拆分入库"; break; case 11: $goodsInfo['remarks'] = "收银订单退货入库"; break; case 12: $goodsInfo['remarks'] = "商城订单退货入库"; break; case 13: $goodsInfo['remarks'] = "组合入库"; break; case 14: $goodsInfo['remarks'] = "拼团换货入库"; break; case 15: $goodsInfo['remarks'] = "秒杀换货入库"; break; case 16: $goodsInfo['remarks'] = "普通换货入库"; break; case 17: $goodsInfo['remarks'] = "预售退货入库"; break; case 18: $goodsInfo['remarks'] = "预售换货入库"; break; case 19: $goodsInfo['remarks'] = "收银赠品退货入库"; break; case 20: $goodsInfo['remarks'] = "商城赠品退货入库"; break; case 21: $goodsInfo['remarks'] = "调拨拒收入库"; break; } $goodsInfo['type'] = $type; $goodsInfo['add_time'] = $time; $SWarehousingGoodsModel = new SWarehousingGoodsModel(); if (!empty($supplier_arr) && !empty($supplier_arr['supplier_json']) && !empty($supplier_arr['purchase_id_str']) && $supplier_arr['supplier_type'] == 2) { //寄售供货商 $SPurchasePayableModel = new SPurchasePayableModel(); $supplier_json = json_decode($supplier_arr['supplier_json'], true); $json_num = 0; $warehouse_id_arr = []; //入库记录id集合 foreach ($supplier_json as $val) { $json_num += $val['num']; $goodsInfo['warehouse_price'] = $val['warehouse_price']; $goodsInfo['warehouse_num'] = $val['num']; $goodsInfo['surplus_num'] = $val['num']; $goodsInfo['supplier_id'] = $val['supplier_id']; $goodsInfo['purchase_order_id'] = $val['purchase_order_id']; if (in_array($type, array(8, 9, 11, 12, 14, 17))) { $goodsInfo['subtotal'] = round($refund_price * $val['num'], 2); } else { $goodsInfo['subtotal'] = round($val['warehouse_price'] * $val['num'], 2); } $res = $SWarehousingGoodsModel->addData($goodsInfo); //串号的外部id集合 if (!empty($serial_list)) { for ($i = 0; $i < $val['num']; $i++) { $warehouse_id_arr[] = $res['data']; } } if (in_array($type, array(8, 9, 11, 12, 17))) { $payable_money = round($val['warehouse_price'] * $val['num'], 2); $SPurchasePayableModel->updateSetDec(array('purchase_order_id' => $val['purchase_order_id']), "payable_money", $payable_money); } } if ($warehouse_num > $json_num) { //出现退货数量大于寄售供货商数量 unset($goodsInfo['supplier_id']); unset($goodsInfo['purchase_order_id']); $goodsInfo['warehouse_price'] = round($goodsInfo['cost_price'], 2); $goodsInfo['warehouse_num'] = round($warehouse_num - $json_num, 3); $goodsInfo['surplus_num'] = $goodsInfo['warehouse_num']; if (in_array($type, array(8, 9, 11, 12, 14, 17))) { $goodsInfo['subtotal'] = round($refund_price * $val['num'], 2); } else { $goodsInfo['subtotal'] = round($val['warehouse_price'] * $val['num'], 2); } $res = $SWarehousingGoodsModel->addData($goodsInfo); if (!empty($serial_list)) { $warehouse_id_arr[] = $res['data']; } } //串号信息 if (!empty($serial_list)) { foreach ($warehouse_id_arr as $key => $val) { if (!empty($serial_list[$key])) { $SerialClass->warehouseSerial([ 'user_type' => 4, 'merchant_id' => $goodsInfo['merchant_id'], 'store_id' => $goodsInfo['store_id'], 'outside_id' => $val, 'goods_id' => $goods_id, 'sku_id' => $sku_id, 'type' => $type, 'add_time' => $time, 'serial_list' => [$serial_list[$key]] ]); } } } } else { $res = $SWarehousingGoodsModel->addData($goodsInfo); if ($res['status'] == 0) { $res['msg'] = "入库记录添加失败"; } //串号信息 if (!empty($serial_list)) { $SerialClass->warehouseSerial([ 'user_type' => 4, 'merchant_id' => $goodsInfo['merchant_id'], 'store_id' => $goodsInfo['store_id'], 'outside_id' => $res['data'], 'goods_id' => $goods_id, 'sku_id' => $sku_id, 'type' => $type, 'add_time' => $time, 'serial_list' => $serial_list ]); } } } else { $res['status'] = 0; $res['msg'] = '未找到该商品无法入商品库'; } return $res; } /** * 门店商品库存状况减少记录与库存操作 此接口针对 $type = 4-17 * @param $param * [ * $goods_id 商品id * $sku_id 规格id * $stock_price 出库价 * $stock_num 出库数量 * $type 出库类型 0其他出库 1退货商户出库 2盘亏出库 3调拨出库 4拼团出库 5秒杀出库 6拆分出库 7收银销售出库 8商城销售出库 9向供货商退货出库 10.组合出库 11.预售出库 12商城普通换货出库 13拼团换货出库 14秒杀换货出库 15预售换货出库 16收银赠品出库 17商城赠品出库 * int $all_money 当前售价 * sell_id 出售记录id * array $serial_list 串号信息 * ] * @return array */ public function goodsNumReduce($param) { $goods_id = $param['goods_id']; $sku_id = $param['sku_id']; $sell_id = $param['sell_id'] ? $param['sell_id'] : 0; $stock_price = $param['stock_price']; $stock_num = $param['stock_num']; $type = $param['type']; $all_money = $param['all_money'] ? $param['all_money'] : 0; $serial_list = $param['serial_list'] ? $param['serial_list'] : []; $where = [ 'goods_id' => $goods_id ]; if (!empty($sku_id)) { $where['sku_id'] = $sku_id; } $SSaleMGoodsModel = new SSaleMGoodsModel(); $goodsInfo = $SSaleMGoodsModel->getFind($where); unset($goodsInfo['id']); if ($goodsInfo) { $goodsInfo['add_time'] = time(); $goodsInfo['stock_num'] = round($stock_num, 3); if ($type == 6 || $type == 10) { $stock_price = $stock_price ? $stock_price : $goodsInfo['cost_price']; //没有出库价按成本价算 $goodsInfo['stock_price'] = round($stock_price, 2); $goodsInfo['cost_price'] = round($goodsInfo['cost_price'], 2); $goodsInfo['subtotal'] = round($goodsInfo['stock_price'] * $goodsInfo['stock_num'], 2); } else { $goodsInfo['cost_price'] = round($goodsInfo['cost_price'], 2); $goodsInfo['stock_price'] = round($goodsInfo['cost_price'], 2); $goodsInfo['sale_price'] = round($stock_price, 2); if ($type == 7 || $type == 8 || $type == 11 || $type == 12 || $type == 15) { $goodsInfo['subtotal'] = round($all_money, 2); } else { $goodsInfo['subtotal'] = round($goodsInfo['sale_price'] * $goodsInfo['stock_num'], 2); } } $goodsInfo['type'] = $type; switch ($type) { case 4: $goodsInfo['remarks'] = '拼团出库'; break; case 5: $goodsInfo['remarks'] = '秒杀出库'; break; case 6: $goodsInfo['remarks'] = '拆分出库'; break; case 7: $goodsInfo['remarks'] = '收银销售出库'; break; case 8: $goodsInfo['remarks'] = '商城销售出库'; break; case 10: $goodsInfo['remarks'] = '组合出库'; break; case 11: $goodsInfo['remarks'] = '预售出库'; break; case 12: $goodsInfo['remarks'] = '普通换货出库'; break; case 13: $goodsInfo['remarks'] = '拼团换货出库'; break; case 14: $goodsInfo['remarks'] = '秒杀换货出库'; break; case 15: $goodsInfo['remarks'] = '预售换货出库'; break; case 16: $goodsInfo['remarks'] = '收银赠品出库'; break; case 17: $goodsInfo['remarks'] = '商城赠品出库'; break; } if (!empty($sell_id)) { $goodsInfo['stock_out_id'] = $sell_id; } $SStockOutGoodsModel = new SStockOutGoodsModel(); $success = $SStockOutGoodsModel->addData($goodsInfo); if ($success['status'] == 1) { if (!empty($serial_list)) { $SerialClass = new SerialNumberGoods(); //串号添加记录 $SerialClass->stockSerial([ 'user_type' => 4, 'merchant_id' => $goodsInfo['merchant_id'], 'store_id' => $goodsInfo['store_id'], 'outside_id' => $success['data'], 'type' => $type, 'goods_id' => $goodsInfo['goods_id'], 'sku_id' => $goodsInfo['sku_id'], 'serial_list' => $serial_list, ]); //串号库存减少 $SerialClass->warehouseSerialDec([ 'user_type' => 4, 'merchant_id' => $goodsInfo['merchant_id'], 'store_id' => $goodsInfo['store_id'], 'serial_id_arr' => $serial_list, 'type' => 2 ]); } $ware_arr = [ 'merchant_id' => $goodsInfo['merchant_id'], 'store_id' => $goodsInfo['store_id'], 'goods_id' => $goods_id, 'surplus_num' => array('gt', 0) ]; if (!empty($sku_id)) { $ware_arr['sku_id'] = $sku_id; } $stock_arr = $this->WarehouseReduce($ware_arr, $stock_num); //商品库库存减少 $res = array( 'status' => 1, 'msg' => '成功', 'id' => $success['data'], 'stock_arr' => $stock_arr ); } else { $res = array( 'status' => 0, 'msg' => '出库记录添加失败' ); } } else { $res = array( 'status' => 0, 'msg' => '未找到该商品' ); } return $res; } /** * 门店仓库的商品可操作数量减少 * @param $where 条件 * @param $total_num 减少的数量 * @return array|bool */ public function WarehouseReduce($where, $total_num) { $SWarehousingGoodsModel = new SWarehousingGoodsModel(); $ware_goods = $SWarehousingGoodsModel->getSelect($where, '', '', "id,surplus_num,purchase_order_id,supplier_id,warehouse_price", "id asc"); if (!empty($ware_goods)) { $stock_arr = []; foreach ($ware_goods as $v) { $ware_push = [ 'id' => $v['id'], 'supplier_id' => $v['supplier_id'], 'purchase_order_id' => $v['purchase_order_id'], 'warehouse_price' => $v['warehouse_price'] ]; if ($v['surplus_num'] >= $total_num) { $ware_push['num'] = $total_num; array_push($stock_arr, $ware_push); break; } else { $ware_push['num'] = $v['surplus_num']; array_push($stock_arr, $ware_push); $total_num = round($total_num - $v['surplus_num'], 3); } } $purchase_id_str = []; $supplier_json = []; if (!empty($stock_arr)) { foreach ($stock_arr as $val) { $SWarehousingGoodsModel->updateSetDec(array('id' => $val['id']), "surplus_num", $val['num']); if (!empty($val['purchase_order_id'])) { if (!in_array($val['purchase_order_id'], $purchase_id_str)) { array_push($purchase_id_str, $val['purchase_order_id']); $supplier_json[$val['purchase_order_id']] = $val; } else { $supplier_json[$val['purchase_order_id']]['num'] += $val['num']; } } } } if (!empty($purchase_id_str)) { $purchase_str = implode(',', $purchase_id_str); $res = array( 'purchase_id_str' => $purchase_str, 'supplier_json' => $supplier_json, ); } } else { $res = false; } return $res; } /*门店盘点 * @param $merchant_id 商户id * @param $store_id 门店id * @param $operator_id 操作人id * @param $user_type 1商户 2门店 3收银员 * @param $warehouse_id 盘点仓库id * @param $remarks 备注 * @param $goodsList 盘点商品 *@param $status 盘点状态 0失败 1完成盘点 2进行中(保存到草稿箱) *@param $inventory_order_id 原盘点单id */ public function Inventorying($merchant_id, $store_id, $operator_id, $user_type, $warehouse_id, $remarks, $goodsList) { $stime = time(); $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[0-9][0-9]*$/"; if (!$goodsList || !$warehouse_id || !$merchant_id || !$store_id) { $res['status'] = 0; $res['msg'] = "参数错误"; $this->ajaxReturn($res); } foreach ($goodsList as $val) { if (!$val['cost_price']) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "成本价有误,未入库的商品严禁盘点"; $this->ajaxReturn($res); } if (!preg_match($reg1, $val['cost_price'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确价格"; $this->ajaxReturn($res); } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确数量"; $this->ajaxReturn($res); } } else { if (!preg_match($reg2, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确数量"; $this->ajaxReturn($res); } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量"; $this->ajaxReturn($res); } } } $data = array(); $data['merchant_id'] = $merchant_id; $data['store_id'] = $store_id; $data['warehouse_id'] = $warehouse_id; $data['remarks'] = $remarks; $data['add_time'] = $stime; $data['operator_id'] = $operator_id; if ($user_type == 3) { //收银员 $data['operator_type'] = 1; } $InventoryOrder = D('SInventoryOrder')->addData($data); if ($InventoryOrder['status'] == 0) { $res['status'] = 0; $res['msg'] = "订单创建失败"; $this->ajaxReturn($res); } $InventoryOrderId = $InventoryOrder['data']; $InventoryOrderNumber = "SP" . orderNumber($InventoryOrderId); //盘点单 $moneyTotal = 0; $numtotal = 0; $warehousing_arr = array(); //入库的商品 $stock_arr = array(); //出库的商品 foreach ($goodsList as $key => &$val) { $content = array(); $content['merchant_id'] = $merchant_id; $content['store_id'] = $store_id; $content['warehouse_id'] = $warehouse_id; $content['inventory_order_id'] = $InventoryOrderId; $content['inventory_order_number'] = $InventoryOrderNumber; $content['add_time'] = $stime; $content['goods_class_id'] = $val['goods_class_id']; $content['goods_id'] = $val['goods_id']; $content['goods_name'] = $val['goods_name']; $content['sku_name'] = $val['sku_name']; $content['goods_number'] = $val['goods_number']; $content['sku_goods_number'] = $val['sku_goods_number']; $content['goods_code'] = $val['goods_code']; $content['company'] = $val['company']; $content['attribute_state'] = $val['attribute_state']; $content['pricing_method'] = $val['pricing_method']; $content['goods_num'] = $val['goods_num']; $content['cost_price'] = $val['cost_price']; $content['inventory_num'] = $val['inventory_num']; $num = round($val['inventory_num'] - $val['goods_num'], 3); switch ($num) { case $num > 0: $content['type'] = 1; break; case $num < 0: $content['type'] = 2; break; case $num = 0: $content['type'] = 0; break; default: $content['type'] = 0; } $content['num'] = $num; $content['subtotal'] = round($num * $val['cost_price'], 2); $content['remarks'] = $val['remarks']; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } $success = D('SInventoryGoods')->addData($content); $moneyTotal += $content['subtotal']; $numtotal += $num; if ($success['status'] == 0) { $res['status'] = 0; $res['msg'] = '盘点失败'; $this->ajaxReturn($res); } if ($num > 0) { //盘盈 $new_arr = array(); $new_arr = $content; $new_arr['id'] = $val['id']; $new_arr['warehouse_price'] = $val['cost_price']; $new_arr['warehouse_num'] = $num; array_push($warehousing_arr, $new_arr); } else if ($num < 0) { //盘亏 $new_arr = array(); $new_arr = $content; $new_arr['id'] = $val['id']; $new_arr['output_num'] = ($val['goods_num'] - $val['inventory_num']); array_push($stock_arr, $new_arr); } } if (!empty($warehousing_arr)) { //盘盈 $type = 3; //盘盈入库 $res = $this->Warehousing($merchant_id, $store_id, $operator_id, $user_type, $supplier_id = 0, $warehouse_id, $remarks, $type, $warehousing_arr, $InventoryOrderNumber); if ($res['status'] == 0) { $res['status'] = 0; $res['msg'] = '入库单操作失败'; $this->ajaxReturn($res); } } if (!empty($stock_arr)) { //盘亏 $type = 2; $res = $this->stockOut($merchant_id, $store_id, $operator_id, $user_type, $warehouse_id, $remarks, $type, $stock_arr, $InventoryOrderNumber); if ($res['status'] == 0) { $res['status'] = 0; $res['msg'] = '入库单操作失败'; $this->ajaxReturn($res); } } $text['amount'] = $moneyTotal; $text['quantity'] = $numtotal; $text['goods_species'] = count($goodsList); $text['status'] = 1; $text['order_number'] = $InventoryOrderNumber; $success = D('SInventoryOrder')->updateData(array('id' => $InventoryOrderId), $text); if ($success['status'] == 0) { $res['status'] = 0; $res['msg'] = '操作失败'; $this->ajaxReturn($res); } $res['status'] = 1; $res['msg'] = '操作成功'; return $res; } //门店盘点最新版 public function Inventorying_V1($parameter) { $purchase_model = new SPurchaseGoodsModel(); $merchant_id = $parameter['merchant_id']; $store_id = $parameter['store_id']; $operator_id = $parameter['operator_id']; $user_type = $parameter['user_type']; $remarks = $parameter['remarks']; $goodsList = $parameter['goodsList']; $status = $parameter['status'] ? $parameter['status'] : 1; //1提交盘点 2保存草稿箱 $inventory_order_id = $parameter['inventory_order_id'] ? $parameter['inventory_order_id'] : null; $supplier_type = $parameter['supplier_type'] ? $parameter['supplier_type'] : 1; //寄售门店 $stime = time(); $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[0-9][0-9]*$/"; if (!$goodsList || !$merchant_id || !$store_id) { $res['status'] = 0; $res['msg'] = "参数错误"; return $res; } if (count($goodsList) > 500) { $res['status'] = 0; $res['msg'] = "一次盘点商品上限为500种商品"; return $res; } $WarehouseModel = new SSaleWarehouseModel(); $warehouse_id = $WarehouseModel->basisOrderGetFindField([ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'status' => 1 ], "id"); if (empty($warehouse_id)) { $res['status'] = 0; $res['msg'] = "请创建供给仓"; return $res; } foreach ($goodsList as $val) { if (!$val['cost_price']) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "成本价有误,未入库的商品严禁盘点"; return $res; } if (!preg_match($reg1, $val['cost_price'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确价格"; return $res; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确盘点数量"; return $res; } if (!preg_match($reg3, abs($val['goods_num']))) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误"; return $res; } } else { if (!preg_match($reg2, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确盘点数量"; return $res; } if (!preg_match($reg2, abs($val['goods_num']))) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误"; return $res; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确盘点数量"; return $res; } if (!preg_match($reg3, abs($val['goods_num']))) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误"; return $res; } } if ($supplier_type == 2 && $val['inventory_num'] > $val['goods_num'] && $val['purchase_order_id'] == '' && !empty($val['pur_id'])) { //寄售门店 $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请与批次号绑定"; return $res; } } if (empty($inventory_order_id)) { $data = array( 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'add_time' => $stime, 'operator_id' => $operator_id ); if ($user_type == 3) { //收银员 $data['operator_type'] = 1; } $InventoryOrder = D('SInventoryOrder')->addData($data); if ($InventoryOrder['status'] == 0) { $res['status'] = 0; $res['msg'] = "订单创建失败"; return $res; } $InventoryOrderId = $InventoryOrder['data']; $InventoryOrderNumber = "SP" . orderNumber($InventoryOrderId); //盘点单 } else if (!empty($inventory_order_id)) { //草稿箱的商品盘点 $InventoryOrderNumber = D('SInventoryOrder')->getFindField(array('id' => $inventory_order_id), "order_number"); if (empty($InventoryOrderNumber)) { $res = array( 'status' => 0, 'msg' => '未找到该盘点单号' ); return $res; } $InventoryOrderId = $inventory_order_id; } $InventoryClass = new InventoryOperation(); if (C('IS_SET_REDIS')) { $orderStateResult = $InventoryClass->testLock([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'order_id' => $InventoryOrderId ]); if ($orderStateResult['status'] != 1) { $res = array( 'status' => 0, 'msg' => '该订单正在操作中,请稍后重试' ); return $res; } $InventoryClass->addLock([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'order_id' => $InventoryOrderId ]); } $moneyTotal = 0; $numtotal = 0; $warehousing_arr = array(); //入库的商品 $stock_arr = array(); //出库的商品 $inventory_goods_ids = array(); //盘点的明细id foreach ($goodsList as $key => &$val) { $content = array( 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'inventory_order_id' => $InventoryOrderId, 'inventory_order_number' => $InventoryOrderNumber, 'add_time' => $stime, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'goods_num' => $val['goods_num'], 'cost_price' => $val['cost_price'], 'inventory_num' => $val['inventory_num'], 'remarks' => $val['remarks'], 'purchase_order_id' => $val['purchase_order_id'] ? $val['purchase_order_id'] : 0 ); $num = round($val['inventory_num'] - $val['goods_num'], 3); if ($num > 0) { $content['type'] = 1; } else if ($num < 0) { $content['type'] = 2; } else { $content['type'] = 0; } $content['num'] = $num; $content['subtotal'] = round($num * $val['cost_price'], 2); if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } if (!empty($inventory_order_id) && !empty($val['inventory_goods_id'])) { array_push($inventory_goods_ids, $val['inventory_goods_id']); $success = D('SInventoryGoods')->updateData(array('id' => $val['inventory_goods_id']), $content); } else { $success = D('SInventoryGoods')->addData($content); if ($success['status'] == 1) { array_push($inventory_goods_ids, $success['data']); } else { if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'order_id' => $InventoryOrderId ]); } return $success; } } $moneyTotal += $content['subtotal']; $numtotal += $num; if ($status == 1) { if ($num > 0) { //盘盈 $new_arr = array(); $new_arr = $content; $new_arr['id'] = $val['id']; $new_arr['warehouse_price'] = $val['cost_price']; $new_arr['warehouse_num'] = $num; if ($supplier_type == 2 && !empty($val['purchase_order_id'])) { //寄售门店 $pur_map = array( 'store_id' => $store_id, 'goods_id' => $val['goods_id'], 'purchase_order_id' => $val['purchase_order_id'] ); if ($val['attribute_state'] == 2) { $pur_map['sku_id'] = $val['sku_id']; } $pru_info = $purchase_model->getFieldInfo($pur_map, "supplier_id,purchase_price"); $new_arr['warehouse_price'] = $pru_info['purchase_price'] ? $pru_info['purchase_price'] : $val['cost_price']; $new_arr['supplier_id'] = $pru_info['supplier_id']; } array_push($warehousing_arr, $new_arr); } else if ($num < 0) { //盘亏 $new_arr = array(); $new_arr = $content; $new_arr['id'] = $val['id']; $new_arr['stock_price'] = $val['cost_price']; $new_arr['output_num'] = round($val['goods_num'] - $val['inventory_num'], 3); array_push($stock_arr, $new_arr); } } } if (!empty($warehousing_arr)) { //盘盈 $parameter = array( 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'operator_id' => $operator_id, 'user_type' => $user_type, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'type' => 3, 'goodsList' => $warehousing_arr, 'order_number' => $InventoryOrderNumber, ); $res = $this->Warehousing($parameter); if ($res['status'] == 0) { if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'order_id' => $InventoryOrderId ]); } $res['status'] = 0; $res['msg'] = '入库单操作失败'; return $res; } } if (!empty($stock_arr)) { //盘亏 $parameter = array( 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'operator_id' => $operator_id, 'user_type' => $user_type, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'type' => 2, 'goodsList' => $stock_arr, 'order_number' => $InventoryOrderNumber ); $res = $this->stockOut($parameter); if ($res['status'] == 0) { if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'order_id' => $InventoryOrderId ]); } $res['status'] = 0; $res['msg'] = '入库单操作失败'; return $res; } } if (!empty($inventory_order_id)) { D('SInventoryGoods')->deleteData(array('inventory_order_id' => $inventory_order_id, 'id' => array('not in', $inventory_goods_ids))); } $text = array( 'amount' => $moneyTotal, 'quantity' => $numtotal, 'goods_species' => count($goodsList), 'status' => $status, 'order_number' => $InventoryOrderNumber ); $success = D('SInventoryOrder')->updateData(array('id' => $InventoryOrderId), $text); if ($success['status'] == 0) { if (!empty($inventory_order_id)) { $res['status'] = 0; $res['msg'] = '暂无修改'; } else { $res['status'] = 0; $res['msg'] = '操作失败'; } if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'order_id' => $InventoryOrderId ]); } return $res; } if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'order_id' => $InventoryOrderId ]); } $res['status'] = 1; $res['msg'] = '操作成功'; return $res; } /** * 门店入库操作(此接口针对 type 0 1 2 3) * @param $parameter * [ * user_type 4门店 6收银员 * merchant_id 商户id * store_id 门店id * operator_id 操作人id * supplier_id 供货商id * warehouse_id 入库仓库id * remarks 入库单备注 * type 入库的商品来源 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6门店申请调拨入库 * goodsList 入库商品信息 * order_number 订单号 * stock 采购库是否减少 1减少 其他不减少 * ] * @return mixed * [ * status * msg * ] */ public function Warehousing($parameter) { if (empty($parameter['warehouse_id'])) { $warehouseResult = new Warehouse(); $warehouseResult = $warehouseResult->getSaleWarehouseId([ 'user_type' => 4, 'merchant_id' => $parameter['merchant_id'], 'store_id' => $parameter['store_id'] ]); if ($warehouseResult['status'] != 1) { $warehouseResult['msg'] = $warehouseResult['message']; return $warehouseResult; } $warehouse_id = $warehouseResult['data']; } else { $warehouse_id = $parameter['warehouse_id']; } $merchant_id = $parameter['merchant_id']; $store_id = $parameter['store_id']; $operator_id = $parameter['operator_id']; $user_type = $parameter['user_type']; $supplier_id = $parameter['supplier_id']; $remarks = $parameter['remarks']; $type = $parameter['type']; $order_number = $parameter['order_number'] ? $parameter['order_number'] : ''; $time = $_SERVER['REQUEST_TIME']; if (empty($store_id) || !isset($type)) { return ['status' => 0, 'msg' => '入库参数错误']; } $result = $this->storeWarehousingGoodsVerify($parameter); if ($result['status'] == 0) { return $result; } $goodsList = $parameter['goodsList']; $data = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'remarks' => $remarks, 'type' => $type, 'add_time' => $time, 'allocation_time' => $time, 'operator_id' => $operator_id ]; //收银员 if ($user_type == 6) { $data['operator_type'] = 1; } try { M()->startTrans(); $SWarehousingRecordModel = new SWarehousingRecordModel(); $warehouseOrder = $SWarehousingRecordModel->addData($data); if ($warehouseOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $warehouseOrderId = $warehouseOrder['data']; if (!empty($order_number)) { $warehouseOrderNumber = $order_number; } else { $warehouseOrderNumber = 'SR' . orderNumber($warehouseOrderId); } $parameter['warehouseOrderNumber'] = $warehouseOrderNumber; $parameter['warehouseOrderId'] = $warehouseOrderId; $result = $this->storeWarehousingGoodsOperation($parameter); if ($result['status'] != 1) { M()->rollback(); return $result; } $text = array( 'money_total' => $result['data']['moneyTotal'], 'goods_species' => count($goodsList), 'real_money_total' => $result['data']['moneyTotal'], 'real_goods_species' => count($goodsList), 'status' => 1, 'order_number' => $warehouseOrderNumber ); $success = $SWarehousingRecordModel->updateData(array('id' => $warehouseOrderId), $text); if ($success['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } M()->commit(); return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 门店入库操作商品验证 * @param $parameter * @return array */ public function storeWarehousingGoodsVerify(&$parameter) { $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; if (is_array($parameter['goodsList'])) { $goodsList = $parameter['goodsList']; } else { $goodsList = json_decode(htmlspecialchars_decode($parameter['goodsList']), true); } if (empty($goodsList)) { return ['status' => 0, 'msg' => '请选择入库的商品']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单次操作上限为500种商品']; } $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $val) { if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期']; } if (empty($val['warehouse_price']) || !preg_match($reg1, $val['warehouse_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['warehouse_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['warehouse_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['warehouse_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->serialVerify([ 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $serialResult['message']]; } if ($val['warehouse_num'] != count($val['serial_list'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '入库数量有误']; } } } $parameter['goodsList'] = $goodsList; return ['status' => 1, 'msg' => '验证成功']; } /** * 门店商品存入入库记录表操作 * @param $parameter * [ * goodsList 商品信息 * warehouseOrderId 入库单id * merchant_id 商户id * store_id 门店id * warehouse_id 仓库id * supplier_id 供货商id * warehouseOrderId 入库单id * warehouseOrderNumber 入库单号 * purchase_order_id 采购单id * stock 1减少采购库存 * type 入库的商品来源 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6该门店申请调拨入库 7初始化商品档案入库 8拼团退货入库 9秒杀退货入库 10拆分入库 11收银退货入库 12商城退货入库 13组合入库 14拼团换货入库 * 15秒杀换货入库 16商城普通换货入库 17预售退货入库 18预售换货入库 19收银赠品退货入库 20商城赠品退货入库 21门店调拨拒收入库 * ] * @return array * [ * status * msg * data=>[ * moneyTotal 入库总金额 * lose 入库失败的商品信息 * cost 成本价添加失败的商品信息 * ] * ] */ public function storeWarehousingGoodsOperation($parameter) { $storeSaleWarehouseModel = new SSaleWarehouseModel(); $SWarehousingGoodsModel = new SWarehousingGoodsModel(); $SPurchaseGoods = new SPurchaseGoodsModel(); $SerialClass = new SerialNumberGoods(); $goodsList = $parameter['goodsList']; $warehouseOrderId = $parameter['warehouseOrderId'] ? $parameter['warehouseOrderId'] : 0; $merchant_id = $parameter['merchant_id']; $store_id = $parameter['store_id']; if (empty($parameter['warehouse_id'])) { $warehouse_info = $storeSaleWarehouseModel->getFind(array('store_id' => $store_id, 'status' => 1)); //仓库id $warehouse_id = $warehouse_info['id']; } else { $warehouse_id = $parameter['warehouse_id']; //仓库id } $supplier_id = $parameter['supplier_id'] ? $parameter['supplier_id'] : ''; $warehouseOrderNumber = $parameter['warehouseOrderNumber'] ? $parameter['warehouseOrderNumber'] : ''; $type = $parameter['type']; $purchase_order_id = $parameter['purchase_order_id'] ? $parameter['purchase_order_id'] : 0; $time = $_SERVER['REQUEST_TIME']; $stock = $parameter['stock'] ? $parameter['stock'] : ''; $moneyTotal = 0; foreach ($goodsList as $val) { $content = [ 'warehouse_record_id' => $warehouseOrderId, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id ? $supplier_id : ($val['supplier_id'] ? $val['supplier_id'] : 0), 'warehouse_order_number' => $warehouseOrderNumber, 'type' => $type, 'add_time' => $time, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'warehouse_price' => $val['warehouse_price'], 'warehouse_num' => $val['warehouse_num'], 'surplus_num' => $val['warehouse_num'], 'subtotal' => round($val['warehouse_price'] * $val['warehouse_num'] * 1, 2), 'remarks' => $val['remarks'], 'purchase_order_number' => $val['order_number'], 'purchase_warehouse_id' => $val['warehouse_id'], 'purchase_order_id' => $purchase_order_id ? $purchase_order_id : ($val['purchase_order_id'] ? $val['purchase_order_id'] : 0), 'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } $success = $SWarehousingGoodsModel->addData($content); if ($success['status'] == 0) { return ['status' => 0, 'msg' => '入库失败']; } //入库串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->warehouseSerial([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'type' => $type, 'add_time' => $time, 'serial_list' => $val['serial_list'], ]); if ($serialResult['status'] != 1) { return callBack(statusCode()['error'], '串号记录添加失败'); } } $moneyTotal += $content['subtotal']; $map = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'goods_id' => $content['goods_id'] ]; if ($content['attribute_state'] == 2) { $map['sku_id'] = $content['sku_id']; } $success = $this->goodsStockOperation($map, $content); if ($success['status'] == 0) { return ['status' => 0, 'msg' => '成本价计算失败']; } if ($stock == 1) { //采购入库 $tap = [ 'id' => $val['id'], 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $val['warehouse_id'], 'goods_id' => $val['goods_id'], ]; if ($content['attribute_state'] == 2) { $tap['sku_id'] = $content['sku_id']; } $SPurchaseGoods->updateSetDec($tap, "surplus_num", $content['warehouse_num']); $SPurchaseGoods->updateSetInc($tap, "warehousing_num", $content['warehouse_num']); //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->warehousePurchaseSerial([ 'user_type' => 4, 'serial_list' => $val['serial_list'], ]); if ($serialResult['status'] != 1) { return ['status' => 0, 'msg' => '采购商品串号信息修改失败']; } } } } return ['status' => 1, 'msg' => '操作成功', 'data' => ['moneyTotal' => $moneyTotal]]; } /** * 门店入库操作(此接口针对 type 4,5,6) * @param $parameter * [ * id 入库单id * order_number 入库订单号 * goodsList 入库商品 * refuseList 拒收的商品 * warehouse_id 仓库id * textarea 备注 * type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4商户调拨入库 5其他门店调拨入库 6该门店申请调拨入库 7初始化商品档案入库 8拼团退货入库 9秒杀退货入库 10拆分入库 11收银退货入库 12商城退货入库 * ] * * @return array|mixed * [ * status * msg * data=>[ * accept_goods_species 入库的商品种数 * accept_money_total 入库的总金额 * accept_total_cost_money 入库的总成本价 * refuse_total_cost_money 拒收的总成本价 * refuse_total_stock_money 拒收的总出库价 * refuse_goods_species 拒收的总商品种数 * ] * * ] */ public function allocationWarehousing($parameter) { $merchant_id = $parameter['merchant_id']; $store_id = $parameter['store_id']; $id = $parameter['id']; $type = $parameter['type']; $order_number = $parameter['order_number']; if (is_array($parameter['goodsList'])) { $goodsList = $parameter['goodsList']; } else { $goodsList = json_decode(htmlspecialchars_decode($parameter['goodsList']), true); } $refuseList = []; if (!empty($parameter['refuseList'])) { if (is_array($parameter['refuseList'])) { $refuseList = $parameter['refuseList']; } else { $refuseList = json_decode(htmlspecialchars_decode($parameter['refuseList']), true); } } $warehouse_id = $parameter['warehouse_id']; $remarks = $parameter['remarks']; $operator_id = $parameter['operator_id']; $param_state = $this->store_warehousing_verify($parameter); //验证订单可否操作 if ($param_state['status'] == 0) { return $param_state; } //商品信息验证 foreach ($goodsList as $value) { if ($value['serial_number_state'] == 1) { if (count($value['serial_list']) != $value['warehouse_num']) { return ['status' => 0, 'msg' => '串号信息与入库数量不等']; } $serial_list = $value['serial_list']; foreach ($serial_list as $val) { if (empty($val['main_serial_number'])) { return ['status' => 0, 'msg' => '有缺少主串号']; } } } } try { M()->startTrans(); if (!empty($refuseList)) { $warehousingModel = new SWarehousingRecordModel(); $refuseWarehousing = new RefuseWarehousing(); $parameter['warehousing_id'] = $id; $warehousing_info = $warehousingModel->getFind(array('id' => $id)); //入库单信息 $parameter['stock_out_id'] = $warehousing_info['stock_out_id']; unset($parameter['goodsList']); unset($parameter['refuseList']); $param_state = $refuseWarehousing->paramVerify($parameter); //验证拒收参数 if ($param_state['status'] == 0) { M()->rollback(); return $param_state; } foreach ($refuseList as &$va) { $va['stock_num'] = round($va['stock_num'] - $va['warehouse_num'], 3); $va['warehouse_price'] = $va['cost_price']; $va['warehouse_num'] = $va['stock_num']; //串号信息 if ($va['serial_number_state'] == 1 && count($va['serial_list']) != $va['warehouse_num']) { M()->rollback(); return ['status' => 0, 'msg' => '拒收的串号列表有误']; } } $parameter['goodsList'] = $refuseList; //拒收的商品信息 $record = $refuseWarehousing->refuseGoodsRecord($parameter); //拒收记录 if ($record['status'] != 1) { M()->rollback(); return $record; } $update_refuse = [ 'type' => $type, 'stock_out_id' => $parameter['stock_out_id'], 'warehousing_id' => $id, 'operator_id' => $operator_id, 'refuse_goods_species' => $record['data']['refuse_goods_species'], 'refuse_total_stock_money' => $record['data']['refuse_total_stock_money'], //拒收的出库价合计金额, 'refuse_total_cost_money' => $record['data']['refuse_total_cost_money'], //拒收成本价, ]; $refuseWarehousing->modifyOrder($update_refuse); //修改订货单 $return_goods = array( 'goodsList' => $parameter['goodsList'], 'merchant_id' => $merchant_id, ); switch ($type) { case 4: $return_goods['type'] = 6; //商户调拨拒收入库 $this->MerchantWarehousingRecord($return_goods); //商户退货入库记录 break; case 6: $return_goods['type'] = 7; //申请调拨调拨拒收入库 $this->MerchantWarehousingRecord($return_goods); //商户退货入库记录 break; case 5: //其他门店调拨拒收入库 $return_goods['store_id'] = $warehousing_info['source_store_id']; //调拨的门店id $return_goods['type'] = 21; $this->storeWarehousingGoodsOperation($return_goods); //门店退货入库记录 break; } unset($parameter['stock_order_id']); unset($parameter['warehousing_id']); unset($parameter['goodsList']); unset($parameter['refuseList']); unset($warehousing_info); } $SaleMGoodsModel = new SSaleMGoodsModel(); $SWarehousingGoodsModel = new SWarehousingGoodsModel(); $SerialClass = new SerialNumberGoods(); $time = time(); $money_total = 0; $total_cost_money = 0;//调拨的总成本价 //操作 foreach ($goodsList as $val) { $store_where = []; if ($val['attribute_state'] == 2) { $store_where['sku_goods_number'] = $val['sku_goods_number']; } else { $store_where['goods_number'] = $val['goods_number']; } $store_where['status'] = array('in', '0,1'); $store_where['store_id'] = $store_id; $store_where['merchant_id'] = $merchant_id; $s_goods_info = $SaleMGoodsModel->getFind($store_where); $data = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'warehouse_record_id' => $id, 'type' => $type, 'goods_class_id' => $s_goods_info['goods_class_id'], 'goods_id' => $s_goods_info['goods_id'], 'sku_id' => $s_goods_info['sku_id'], 'goods_name' => $val['goods_name'], 'sku_name' => $val['sku_name'], 'sku_id_list' => $val['sku_id_list'], 'goods_number' => $s_goods_info['goods_number'], 'sku_goods_number' => $s_goods_info['sku_goods_number'], 'goods_code' => $s_goods_info['goods_code'], 'sku_code' => $s_goods_info['sku_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'sku_num' => round($val['sku_num'], 3), 'warehouse_price' => round($val['warehouse_price'], 2), 'warehouse_num' => round($val['warehouse_num'], 3), 'surplus_num' => round($val['warehouse_num'], 3), 'subtotal' => round($val['warehouse_price'] * $val['warehouse_num'], 2), 'remarks' => $val['remarks'], 'warehouse_order_number' => $order_number, 'add_time' => $time, 'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ]; $res = $SWarehousingGoodsModel->addData($data); //入库记录 if ($res['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '商品入库记录保存失败']; } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->warehouseSerial([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'outside_id' => $res['data'], 'goods_id' => $s_goods_info['goods_id'], 'sku_id' => $s_goods_info['sku_id'] ? $s_goods_info['sku_id'] : 0, 'type' => $type, 'add_time' => $time, 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串号保存失败']; } } $money_total += $data['subtotal']; $total_cost_money += round(($val['cost_price'] ? $val['cost_price'] : 0) * $val['warehouse_num'], 2); $map = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'goods_id' => $s_goods_info['goods_id'] ]; if ($val['attribute_state'] == 2) { $map['sku_id'] = $s_goods_info['sku_id']; } $val['goods_id'] = $s_goods_info['goods_id']; $val['goods_class_id'] = $s_goods_info['goods_class_id']; $val['warehouse_num'] = round($val['warehouse_num'], 3); $val['warehouse_price'] = round($val['warehouse_price'], 2); $val['add_time'] = $time; $this->goodsStockOperation($map, $val); //数量与成本价操作 } //门店入库单状态修改 if (!empty($refuseList)) { $refuse_status = 2; //存在拒收 } $text = [ 'real_goods_species' => count($goodsList), 'real_money_total' => $money_total, 'add_time' => $time, 'remarks' => $remarks, 'status' => 1, 'operator_id' => $operator_id, 'warehouse_id' => $parameter['warehouse_id'], 'refuse_status' => $refuse_status ? $refuse_status : 1 ]; $SWarehousingRecordModel = new SWarehousingRecordModel(); $success = $SWarehousingRecordModel->updateData(array('id' => $id), $text); if ($success['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '调拨单状态修改失败']; } if ($type == 4 || $type == 6) { //商户调拨 $stock_out_id = $SWarehousingRecordModel->getFindField(array('id' => $id), "stock_out_id"); $real_data = [ 'real_goods_species' => count($goodsList), 'real_money_total' => $money_total, 'warehousing_status' => 1, 'warehouse_time' => $time, 'real_total_cost_money' => $total_cost_money ]; $StockOutOrderModel = new StockOutOrderModel(); if ($type == 4) { $success = $StockOutOrderModel->updateData(array('id' => $stock_out_id, 'type' => 1), $real_data); } else if ($type == 6) { $success = $StockOutOrderModel->updateData(array('id' => $stock_out_id, 'type' => 3), $real_data); } if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '商户调拨单状态修改失败']; } } else if ($type == 5) { //其他门店调拨 $real_data = [ 'real_goods_species' => count($goodsList), 'real_money_total' => $money_total, 'warehousing_status' => 1, 'warehouse_time' => $time, 'real_total_cost_money' => $total_cost_money ]; $SStockOutOrderModel = new SStockOutOrderModel(); $success = $SStockOutOrderModel->updateData(array('warehouse_record_id' => $id, 'type' => 3), $real_data); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '门店调拨单状态修改失败']; } } if (!empty($refuseList)) { $res['refuse_status'] = 2; //存在拒收 } M()->commit(); $res['status'] = 1; $res['msg'] = '操作成功'; $res['accept_goods_species'] = count($goodsList); $res['accept_money_total'] = $money_total; $res['accept_total_cost_money'] = $total_cost_money; $res['refuse_total_cost_money'] = $record['data']['refuse_total_cost_money']; $res['refuse_total_stock_money'] = $record['data']['refuse_total_stock_money']; $res['refuse_goods_species'] = $record['data']['refuse_goods_species']; return $res; } catch (\Exception $e) { return ['status' => 0, 'msg' => '入库失败']; } } /** * 验证调拨单门店入库是否可以入库 * @param $param * @return mixed */ protected function store_warehousing_verify($param) { if (!$param['id'] || !$param['goodsList'] || !$param['warehouse_id'] || !$param['order_number'] || !$param['merchant_id'] || !$param['store_id'] || !$param['type']) { $res['status'] = 0; $res['msg'] = '参数缺失'; return $res; } if (in_array($param['type'], array(4, 5, 6))) { switch ($param['type']) { case 4: case 6: //商户调拨 $SWarehousingRecordModel = new SWarehousingRecordModel(); $res = $SWarehousingRecordModel->merchant_param_verify($param['id']); break; case 5: //门店调拨 $StockOutOrderModel = new SStockOutOrderModel(); $res = $StockOutOrderModel->store_param_verify($param['id']); break; } } else { $res['status'] = 1; $res['msg'] = '验证成功'; } return $res; } //门店商品库存增加成本价重置 public function goodsStockOperation($where, $data) { $SSaleMGoodsModel = new SSaleMGoodsModel(); $info = $SSaleMGoodsModel->getFind($where); if (!empty($info)) { $SSaleMGoodsModel->updateSetInc(array('id' => $info['id']), "goods_num", $data['warehouse_num']); if ($info['cost_price'] != $data['warehouse_price']) {//入库价与成本价不一样 $success = $this->costPrice($where); if ($success['status'] == 1) { $cost_price = $success['data']; $SSaleMGoodsModel->updateData($where, array('cost_price' => $cost_price)); if (!empty($where['sku_id'])) { M('retail_sku_goods')->where(array('id' => $where['sku_id'], 'goods_id' => $where['goods_id']))->save(array('purchase_price' => $cost_price)); } else { D('Goods')->updateOrder(array('id' => $where['goods_id']), array('purchase_price' => $cost_price)); } } else { $res['status'] = 0; $res['msg'] = '成本价计算出错'; } } else { $cost_price = $data['warehouse_price']; } if ($cost_price) { $cost_record = array(); $cost_record['merchant_id'] = $where['merchant_id']; $cost_record['store_id'] = $where['store_id']; $cost_record['cost_price'] = $cost_price; $cost_record['goods_id'] = $where['goods_id']; if ($data['attribute_state'] == 2) { $cost_record['sku_id'] = $where['sku_id']; } $cost_record['purchase_price'] = $data['warehouse_price']; $cost_record['goods_class_id'] = $data['goods_class_id']; $cost_record['attribute_state'] = $data['attribute_state']; $cost_record['pricing_method'] = $data['pricing_method']; $cost_record['add_time'] = $data['add_time']; $SCostPriceRecordModel = new SCostPriceRecordModel(); $success = $SCostPriceRecordModel->addData($cost_record); if ($success['status'] == 1) { $res['status'] = 1; $res['msg'] = '成功'; } else { $res['status'] = 0; $res['msg'] = '成本价记录失败'; } } } else { $res['status'] = 0; $res['msg'] = '未找到该商品'; } return $res; } //门店成本价计算 public function costPrice($where) { $where['surplus_num'] = array('gt', 0); $fields = "surplus_num,warehouse_price"; $order = "add_time asc"; $list = D('SWarehousingGoods')->getSelect($where, $page = '', $limit = '', $fields, $order); if ($list) { $priceTotal = 0; $numTotal = 0; foreach ($list as $val) { $priceTotal += $val['surplus_num'] * $val['warehouse_price']; $numTotal += $val['surplus_num']; } $cost_price = round(($priceTotal / $numTotal), 2); $res['status'] = 1; $res['data'] = $cost_price; } else { $res['status'] = 0; $res['msg'] = '该商品已售完'; } return $res; } /** * 门店出库操作 * @param $param * [ * merchant_id 商户id * store_id 门店id * supplier_id 供货商id * operator_id 操作人id * user_type 3商户 4门店 6收银员 * warehouse_id 出库仓库id * remarks 备注 * type 0其他出库 1向商户退货出库 2盘亏出库 3调拨出库 9向供货商退货出库 * goodsList 出库商品 * transfer_id 调拨至目标门店id * order_number 出库单号 * stock_order_id 门店调拨出库商户拒绝后重新调拨的出库单id * ] * 此接口针对type 0,1,2,3,9 * @return mixed * [ * status * msg * ] */ public function stockOut($param) { $verifyResult = $this->stockOutVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } if ($param['type'] == 4) { foreach($param['goodsList'] as &$item) { $item['subtotal'] = ''; $item['apply_num'] = $item['output_num']; } return $this->ApplyOperation($param); } $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $supplier_id = $param['supplier_id'] ? $param['supplier_id'] : null; $operator_id = $param['operator_id']; $user_type = $param['user_type']; $warehouse_id = $param['warehouse_id']; $remarks = $param['remarks']; $type = $param['type']; $goodsList = $param['goodsList']; $order_number = $param['order_number'] ? $param['order_number'] : ''; $transfer_id = $param['transfer_id'] ? $param['transfer_id'] : null; $stock_order_id = $param['stock_order_id'] ? $param['stock_order_id'] : null; $examine_status = $verifyResult['data']['examine_status']; $merchant_warehouse_id = $verifyResult['data']['merchant_warehouse_id']; $store_warehouse_id = $verifyResult['data']['store_warehouse_id']; $time = $_SERVER['REQUEST_TIME']; $data = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'type' => $type, 'add_time' => $time, 'operator_id' => $operator_id, 'examine_status' => $examine_status ? $examine_status : 0 ]; if ($type == 3) { $data['transfer_to_store_id'] = $transfer_id; } if ($user_type == 6) {//收银员 $data['operator_type'] = 1; } if ($type == 9) { $data['supplier_id'] = $supplier_id; } try { M()->startTrans(); $StockOutOrderModel = new SStockOutOrderModel(); if (!empty($stock_order_id)) { //修改出库单 $StockOutOrder = $StockOutOrderModel->updateData(array('id' => $stock_order_id), $data); $StockOutOrderId = $stock_order_id; } else { $StockOutOrder = $StockOutOrderModel->addData($data); $StockOutOrderId = $StockOutOrder['data']; } if ($StockOutOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } if (!empty($order_number)) { $StockOutOrderNumber = $order_number; } else { switch ($type) { case 0: $order_name = "SQ"; break; case 1: $order_name = "SM"; break; case 2: $order_name = "SP"; break; case 3: $order_name = "SD"; break; case 9: $order_name = "SG"; break; } $StockOutOrderNumber = $order_name . orderNumber($StockOutOrderId); } if ($type == 1) { //退货出库 $m_warehouse = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $merchant_warehouse_id, 'stock_out_id' => $StockOutOrderId, 'remarks' => $remarks, 'type' => 4, 'retreat_time' => $time, ]; $WarehousingRecordModel = new WarehousingRecordModel(); $m_warehouse_info = $WarehousingRecordModel->addData($m_warehouse); if ($m_warehouse_info['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $warehouse_record_id = $m_warehouse_info['data']; } else if ($type == 3) { //调拨出库 $SWarehousingRecordModel = new SWarehousingRecordModel(); if (!empty($stock_order_id)) { $SWarehousingRecordModel->updateData(array('stock_out_id' => $stock_order_id), array("examine_status" => $data['examine_status'], "allocation_time" => $time)); $warehouse_record_id = $SWarehousingRecordModel->basisOrderGetFindField(array('stock_out_id' => $stock_order_id), "id"); } else { $s_warehouse = [ 'merchant_id' => $merchant_id, 'store_id' => $transfer_id, 'source_store_id' => $store_id, 'warehouse_id' => $store_warehouse_id, 'stock_out_id' => $StockOutOrderId, 'remarks' => $remarks, 'type' => 5, 'allocation_time' => $time, 'examine_status' => $examine_status ? $examine_status : 0, ]; $s_warehouse_record_info = $SWarehousingRecordModel->addData($s_warehouse); $warehouse_record_id = $s_warehouse_record_info['data']; } } $StockOutGoodsModel = new SStockOutGoodsModel(); $SaleMGoodsModel = new SSaleMGoodsModel(); $SerialClass = new SerialNumberGoods(); $moneyTotal = 0; //出库总金额 $total_cost_price = 0; //总成本价 foreach ($goodsList as $key => &$val) { $content = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'stock_out_id' => $StockOutOrderId, 'stock_order_number' => $StockOutOrderNumber, 'type' => $type, 'add_time' => $time, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'cost_price' => $val['cost_price'], 'stock_price' => $val['stock_price'], 'stock_num' => $val['output_num'], 'subtotal' => round($val['stock_price'] * $val['output_num'] * 1, 2), 'remarks' => $val['remarks'], 'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ]; if ($type == 1 || $type == 3) { $content['warehouse_record_id'] = $warehouse_record_id; } if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } if ($type == 3) { $content['examine_status'] = $data['examine_status']; } if ($type == 9) { $content['supplier_id'] = $supplier_id; } if ($type == 3 && !empty($stock_order_id) && !empty($val['stock_id'])) { $success = $StockOutGoodsModel->updateData(array('id' => $val['stock_id']), $content); if ($success['status'] == 1 && $val['serial_number_state'] == 1) { $serialResult = $SerialClass->stockSerialDelete([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'outside_id' => $val['stock_id'], 'type' => $type, 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串号修改失败']; } } $outside_id = $val['stock_id']; } else { $success = $StockOutGoodsModel->addData($content); $outside_id = $success['data']; } if ($success['status'] == 0) { return ['status' => 0, 'msg' => '出库失败']; } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->stockSerial([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'outside_id' => $outside_id, 'type' => $type, 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串号保存失败']; } } $moneyTotal += $content['subtotal']; $total_cost_price += round($content['cost_price'] * $content['stock_num'], 2); $goods_total_num = $SaleMGoodsModel->getFindField(array('id' => $val['id']), "goods_num"); $SaleMGoodsModel->updateSetDec(array('id' => $val['id']), "goods_num", $val['output_num']); if ($goods_total_num > 0) { if ($type == 3 && $data['examine_status'] == 0) { //调拨出库并且需要审核只减总库存修改串号数量 if ($val['serial_number_state'] == 1) { $serial_id_arr = array_column($val['serial_list'], 'id'); $serialResult = $SerialClass->warehouseSerialDec([ 'user_type' => 4, 'serial_id_arr' => $serial_id_arr, 'type' => 1, 'merchant_id' => $merchant_id, 'store_id' => $store_id ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => $serialResult['message']]; } } } else { $ware_arr = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'goods_id' => $val['goods_id'], 'surplus_num' => ['gt', 0], ]; if ($val['attribute_state'] == 2) { $ware_arr['sku_id'] = $val['sku_id']; } $this->WarehouseReduce($ware_arr, $val['output_num']); //串号信息操作 if ($val['serial_number_state'] == 1) { $serial_id_arr = array_column($val['serial_list'], 'id'); $serialResult = $SerialClass->warehouseSerialDec([ 'user_type' => 4, 'serial_id_arr' => $serial_id_arr, 'type' => 1, 'merchant_id' => $merchant_id, 'store_id' => $store_id ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => $serialResult['message']]; } } if ($type == 9) { //退货出库完重新计算成本价 $cost_map = array(); $cost_map['merchant_id'] = $merchant_id; $cost_map['store_id'] = $store_id; $cost_map['warehouse_id'] = $warehouse_id; $cost_map['goods_id'] = $content['goods_id']; if ($content['attribute_state'] == 2) { $cost_map['sku_id'] = $content['sku_id']; } $success = $this->costPrice($cost_map); if ($success['status'] == 1) { $cost_price = round($success['data'], 2); if ($cost_price > 0) { D('SSaleMGoods')->updateData($cost_map, array('cost_price' => $cost_price)); if (!empty($cost_map['sku_id'])) { M('retail_sku_goods')->where(array('id' => $cost_map['sku_id'], 'goods_id' => $cost_map['goods_id']))->save(array('purchase_price' => $cost_price)); } else { D('Goods')->updateOrder(array('id' => $cost_map['goods_id']), array('purchase_price' => $cost_price)); } $cost_content = array( 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'cost_price' => $cost_price, 'goods_id' => $content['goods_id'], 'sku_id' => $content['sku_id'] ? $content['sku_id'] : 0, 'purchase_price' => $content['stock_price'], 'goods_class_id' => $content['goods_class_id'], 'attribute_state' => $content['attribute_state'], 'pricing_method' => $content['pricing_method'], 'add_time' => $content['add_time'], 'type' => 2 ); D("SCostPriceRecord")->addData($cost_content); } } } } } } $text = array( 'money_total' => $moneyTotal, 'total_cost_price' => $total_cost_price, 'goods_species' => count($goodsList), 'status' => 1, 'order_number' => $StockOutOrderNumber ); if ($type == 1 || $type == 3) { $text['warehouse_record_id'] = $warehouse_record_id; } $StockOutOrderModel->updateData(array('id' => $StockOutOrderId), $text); unset($text['status']); unset($text['warehouse_record_id']); switch ($type) { case 1: $WarehousingRecordModel->updateData(array('id' => $warehouse_record_id), $text); break; case 3: $SWarehousingRecordModel->updateData(array('id' => $warehouse_record_id), $text); break; case 9: //向供货商退货 $capital_arr = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'supplier_id' => $supplier_id, 'retreat_order_id' => $StockOutOrderId, 'retreat_order_number' => $StockOutOrderNumber, 'operator_id' => $operator_id, 'retreat_time' => $time, 'collect_money' => $moneyTotal, 'type' => 2 ]; $SRetreatReceivablesModel = new SRetreatReceivablesModel(); $result = $SRetreatReceivablesModel->addData($capital_arr); if ($result['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '退货资金信息保存失败']; } break; } if ($type != 2) { switch ($type) { case 0: $inventory_type = 7; break; case 1: $inventory_type = 8; break; case 3: $inventory_type = 9; break; case 9: $inventory_type = 10; break; } $text['operator_id'] = $operator_id; $text['add_time'] = $time; $print_parameter = array( 'id' => $StockOutOrderId, 'order_info' => $text, 'identity' => 2, 'type' => $inventory_type, 'store_id' => $store_id ); A('PayApi/Printer')->inventoryPrint($print_parameter); } M()->commit(); $res['status'] = 1; $res['msg'] = '成功'; return $res; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 门店出库操作的参数验证 * @param $param * [ * merchant_id 商户id * store_id 门店id * supplier_id 供货商id * operator_id 操作人id * user_type 1商户 2门店 3收银员 * warehouse_id 出库仓库id * remarks 备注 * type 0其他出库 1向商户退货出库 2盘亏出库 3调拨出库 9向供货商退货出库 * goodsList 出库商品 * transfer_id 调拨至目标门店id * order_number 出库单号 * stock_order_id 门店调拨出库商户拒绝后重新调拨的出库单id * ] * @return array */ public function stockOutVerify(&$param) { $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; if (empty($param['merchant_id'])) { return ['status' => 0, 'msg' => '缺少商户唯一标识']; } if (empty($param['store_id'])) { return ['status' => 0, 'msg' => '缺少门店唯一标识']; } if (empty($param['warehouse_id'])) { $SaleWarehouseModel = new SSaleWarehouseModel(); $warehouse_id = $SaleWarehouseModel->getFindField(array('store_id' => $param['store_id'], 'status' => 1), "id"); if (empty($warehouse_id)) { return ['status' => 0, 'msg' => '请先创建供给仓']; } $param['warehouse_id'] = $warehouse_id; } if (is_array($param['goodsList'])) { $goodsList = $param['goodsList']; } else { $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); } if (empty($goodsList)) { return ['status' => 0, 'msg' => '请选择商品']; } if (!isset($param['type']) || empty($param['operator_id'])) { return ['status' => 0, 'msg' => '缺少操作者唯一标识']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单此操作上限为500种商品']; } switch ($param['type']) { case 1: $SaleWarehouseModel = new SaleWarehouseModel(); $merchant_warehouse = $SaleWarehouseModel->getFind(array('merchant_id' => $param['merchant_id'])); if (empty($merchant_warehouse)) { return ['status' => 0, 'msg' => '商户未创建供给仓']; } $merchant_warehouse_id = $merchant_warehouse['id']; break; case 3: if (empty($param['transfer_id'])) { return ['status' => 0, 'msg' => '缺少目标门店唯一标识']; } $SaleWarehouseModel = new SSaleWarehouseModel(); $store_warehouse = $SaleWarehouseModel->getFind(array('merchant_id' => $param['merchant_id'], 'store_id' => $param['transfer_id'], 'status' => 1)); if (empty($store_warehouse)) { return ['status' => 0, 'msg' => '该门店未创建供给仓']; } $store_warehouse_id = $store_warehouse['id']; $store_allocation = M("retail_store_jurisdiction")->where(array("storeid" => $param['store_id']))->getField("store_allocation"); if ($store_allocation == 2) {//不需要审核 $transefer_allocation = M('retail_store_jurisdiction')->where(array('storeid' => $param['transfer_id']))->getField("store_allocation"); if ($transefer_allocation == 2) { $examine_status = 1; } } break; case 9: //退货供货商出库 if (empty($param['supplier_id'])) { return ['status' => 0, 'msg' => '请选择供货商']; } break; } foreach ($goodsList as $val) { if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确的保质期']; } if (empty($val['stock_price']) || !preg_match($reg1, $val['stock_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['output_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['output_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['output_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } if ($val['output_num'] * 1 > $val['goods_num'] * 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '出库数量不能大于辅助数量']; } //串号信息 if ($val['serial_number_state'] == 1) { if (empty($val['serial_list']) || count($val['serial_list']) != $val['output_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } } $param['goodsList'] = $goodsList; return ['status' => 1, 'msg' => '验证成功', 'data' => ['examine_status' => $examine_status ? $examine_status : '', 'merchant_warehouse_id' => $merchant_warehouse_id, 'store_warehouse_id' => $store_warehouse_id]]; } /* *门店入库商品验证 (用于门店处理调拨进来的商品验证) *@param $merchant_id 商户id *@param $store_id 门店id *@param $goodsList 入库的商品信息 */ public function goodsVerify($merchant_id, $store_id, $goodsList) { $WarehouseClass = new WarehouseOperation(); $result = $WarehouseClass->goodsListVerify($merchant_id, $store_id, $goodsList); if ($result['status'] != 3) { $result['msg'] = $result['message']; } return $result; } /** * 门店商品信息同步 用于门店处理调拨进来的商品信息同步 * @param $param * [ * operate_id * merchant_id * store_id * goodsIds * type 4商户调拨过来需要同步的商品 5其他门店调拨过来需要同步的商品 * ] * @return mixed */ public function batchSync($param) { $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $goodsIds = $param['goodsIds']; $type = $param['type']; $operate_id = $param['operate_id']; $SSaleWarehouseModel = new SSaleWarehouseModel(); $warehouse_id = $SSaleWarehouseModel->getFindField(array("store_id" => $store_id, "status" => 1), "id"); //供给仓id if (!$warehouse_id) { $res['status'] = 0; $res['msg'] = '请先创建门店供给仓'; return $res; } switch ($type) { case 4: //商户调拨过来需要同步的商品 $GoodsModel = new MGoodsModel(); break; case 5: //其他门店调拨过来需要同步的商品 $GoodsModel = new RetailGoodsModel(); break; default: $res['status'] = 0; $res['msg'] = "参数错误,请刷新重试"; return $res; } $goodsList = $GoodsModel->getSelect(array('id' => array('in', $goodsIds))); if (empty($goodsList)) { $res['status'] = 0; $res['msg'] = "未找到商品信息,请确认对方是否已清空商品信息"; return $res; } $time = $_SERVER['REQUEST_TIME']; $error_journal = array(); $editRecord = []; $edit_arr = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'add_time' => $time ]; $company_arr = []; //单位集合 $relation_arr = []; //门店与商户或者其他门店的商品关联信息 $add_id_arr = []; //新增商品的商户或其他门店商品id集合 foreach ($goodsList as $val) { if (!empty($val['company']) && !in_array($val['company'], $company_arr)) { $company_arr[] = $val['company']; } $goodsInfo = $val; if ($type == 4) { $goodsInfo['online_state'] = $val['issellonline'] ? $val['issellonline'] : 0; } $goodsInfo['purchase_price'] = 0; $goodsInfo['goods_num'] = 0; $goodsInfo['status'] = 0; $goodsInfo['merchant_id'] = $merchant_id; $goodsInfo['store_id'] = $store_id; $goodsInfo['vip_online_price'] = $val['vip_online_price'] ? $val['vip_online_price'] : 0; $goodsInfo['vip_retail_price'] = $val['vip_retail_price'] ? $val['vip_retail_price'] : 0; $goodsInfo['more_num'] = $val['more_num'] ? $val['more_num'] : 0; $goodsInfo['less_num'] = $val['less_num'] ? $val['less_num'] : 0; $goodsInfo['sync_state'] = 1; $goodsInfo['add_time'] = $time; switch ($type) { case 4: //商户调拨过来需要同步的商品 $goodsInfo['goods_number'] = $val['good_number']; $goodsInfo['pricing_method'] = $val['can_exchange_weigh'] ? $val['can_exchange_weigh'] : 1; $goodsInfo['attribute_state'] = $val['attribute'] ? $val['attribute'] : 1; $goodsInfo['source_type'] = 2; $goodsInfo['m_goods_id'] = $val['id']; $goodsInfo['goods_img_id'] = $val['goods_image_id'] ? $val['goods_image_id'] : 0; break; case 5: //其他门店调拨过来需要同步的商品 $goodsInfo['source_type'] = $val['source_type'] == 2 ? $val['source_type'] : 1; $goodsInfo['goods_img_id'] = $val['goods_img_id'] ? $val['goods_img_id'] : 0; } unset($goodsInfo['id']); $existGoodsId = ""; //已经存在的商品id $sku_goods_number = ""; //规格商品已经存在的规格货号 if ($goodsInfo['attribute_state'] == 2) { $existGoodsId = D('RetailGoods')->getFindField(array('store_id' => $store_id, 'status' => array('in', '0,1'), 'goods_number' => $goodsInfo['goods_number']), "id"); } else if ($goodsInfo['attribute_state'] == 1) { $store_goods_id = D('RetailGoods')->getFindField(array('store_id' => $store_id, 'status' => array('in', '0,1'), 'goods_number' => $goodsInfo['goods_number']), "id"); if (!empty($store_goods_id)) { $arr = array('goods_name' => $val['goods_name'], 'error' => '已经存在该商品'); array_push($error_journal, $arr); unset($arr); continue; } } if (!empty($existGoodsId)) { $sku_goods_number = D("RetailSkuGoods")->getFindField(array('goods_id' => $existGoodsId, 'state' => 0), "sku_goods_number", true); } else { $add = D('RetailGoods')->addOrder($goodsInfo); if (!$add) { $arr = array('goods_name' => $val['goods_name'], 'error' => '同步失败'); array_push($error_journal, $arr); unset($arr); continue; } $relation_arr[$val['id']] = $add; $add_id_arr[] = $val['id']; } $s_goods_id = $existGoodsId ? $existGoodsId : $add; $saleGoods = $goodsInfo; $saleGoods['merchant_id'] = $merchant_id; $saleGoods['warehouse_id'] = $warehouse_id; $saleGoods['goods_id'] = $s_goods_id; if ($goodsInfo['attribute_state'] == 1) { $this->addSaleGoods($saleGoods, 1); //供给仓 1增加 } else if ($goodsInfo['attribute_state'] == 2) { // 同步规格 $add_sku = $this->addSku($val['id'], $s_goods_id, $store_id, $saleGoods, $type, $sku_goods_number); if ($add_sku['status'] == 0) { $arr = array('goods_name' => $val['goods_name'], 'error' => $add_sku['msg']); array_push($error_journal, $arr); unset($arr); } } $m_goods_id = $val['id']; // 规格同步,终止不会结束当前商品同步 $add_banner = $this->addBanner($s_goods_id, $store_id, $m_goods_id, $type); // 轮播图同步,终止不会结束当前商品同步 // 同步轮播图 if ($add_banner['status'] == 0) { $arr = array('goods_name' => $val['goods_name'] . '5', 'error' => $add_banner['msg']); array_push($error_journal, $arr); unset($arr); } $edit_arr['goods_id'] = $s_goods_id; $editRecord[] = $edit_arr; unset($add); } //单位库 if (!empty($company_arr)) { $UnitClass = new UnitLibrary(); $companyResult = $UnitClass->addUnit([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'company_arr' => json_encode($company_arr) ]); if ($companyResult['status'] != 1) { $arr = array('error' => '单位库添加失败'); array_push($error_journal, $arr); } } //标签处理 if (!empty($relation_arr)) { $LabelClass = new LabelInventory(); $labelResult = $LabelClass->basisGoodsIdGetLabelList([ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'goods_id_arr' => json_encode($add_id_arr), 'user_type' => $type == 4 ? 3 : 4 ]); if ($labelResult['status'] == 1 && !empty($labelResult['data'])) { $labelResult = $LabelClass->addLabel([ 'user_type' => 4, 'operate_id' => $operate_id, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'label_arr' => json_encode($labelResult['data']), 'relation_arr' => json_encode($relation_arr) ]); if ($labelResult['status'] != 1) { $arr = array('error' => '标签关联失败'); array_push($error_journal, $arr); } } } if (!empty($editRecord)) { //商品信息更新记录 $GoodsClass = new Goods(); $GoodsClass->goodsEditRecord([ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'goods_id' => $editRecord ]); } if (!$error_journal) { $res['status'] = 1; $res['msg'] = '同步成功'; } else { $res['status'] = 2; $res['error_journal'] = $error_journal; } return $res; } /** * 门店同步轮播图 * @param [int] $goods_id 门店商品id * @param [int] $storeid 门店id * @param [int] $mgoods_id 商户商品id * @return [array] $res */ public function addBanner($goods_id, $store_id, $m_goods_id, $type) { switch ($type) { case 4: $banner = M('retail_mgoods_banner')->where(array('mgoods_id' => $m_goods_id))->select(); break; case 5: $banner = M('retail_goods_banner')->where(array('goods_id' => $m_goods_id))->select(); break; } if (!$banner) { $res['status'] = 2; $res['msg'] = '暂无轮播图'; return $res; } foreach ($banner as &$val) { switch ($type) { case 4: $mgoods_banner_id = $val['id']; break; case 5: if (!empty($val['mgoods_banner_id'])) { $mgoods_banner_id = $val['mgoods_banner_id']; } else { $mgoods_banner_id = 0; } break; } unset($val['id']); unset($val['mgoods_id']); $cr = $val; $cr['goods_id'] = $goods_id; $cr['storeid'] = $store_id; $cr['mgoods_banner_id'] = $mgoods_banner_id; $add = M('retail_goods_banner')->add($cr); if (!$add) { $res['status'] = 0; $res['msg'] = '同步失败'; return $res; break; } } $res['status'] = 1; $res['msg'] = '同步成功'; return $res; } /** * 门店同步规格商品 * @param $m_goods_id 来源的商品id(商户或者其他门店的商品id) * @param [int] $goods_id 商品id * @param [int] $storeid 门店id * @param $saleGoods 供给仓要添加的商品信息 * @param $type 4商户调拨过来 5其他门店调拨过来 * @param $sku_goods_number 已经存在的规格货号 * @return [array] $res */ public function addSku($m_goods_id, $goods_id, $store_id, $saleGoods, $type, $sku_goods_number) { $sku_wap = array(); switch ($type) { case 4: $sku_wap['mgoods_id'] = $m_goods_id; $sku_wap['state'] = 0; if (!empty($sku_goods_number)) { $sku_wap['sku_goods_number'] = array('not in', $sku_goods_number); } $skuList = M('retail_sku_mgoods')->where($sku_wap)->order("id asc")->select(); break; case 5: $sku_wap['goods_id'] = $m_goods_id; $sku_wap['state'] = 0; if (!empty($sku_goods_number)) { $sku_wap['sku_goods_number'] = array('not in', $sku_goods_number); } $skuList = M('retail_sku_goods')->where($sku_wap)->order("id asc")->select(); break; } if (empty($skuList)) { $res['status'] = 0; $res['msg'] = '商品规格信息已清空'; return $res; } foreach ($skuList as &$val) { switch ($type) { case 4: $sku_mgoods_id = $val['id']; break; case 5: $sku_mgoods_id = $val['sku_mgoods_id'] ? $val['sku_mgoods_id'] : 0; break; } unset($val['id']); $skuInfo = $val; $skuInfo['purchase_price'] = 0; $skuInfo['goods_num'] = 0; $skuInfo['goods_id'] = $goods_id; $skuInfo['store_id'] = $store_id; $skuInfo['sku_mgoods_id'] = $sku_mgoods_id; $add = M('retail_sku_goods')->add($skuInfo); if (!$add) { $res['status'] = 0; $res['msg'] = '规格同步失败,中断规格同步'; return $res; break; } $sku_name = M('retail_sku_list')->where(array('id' => array('in', $val['sku_id_list'])))->field("name")->select(); $sku_name = array_column($sku_name, "name"); $sku_name = implode(',', $sku_name); $saleGoods['purchase_price'] = $skuInfo['purchase_price']; $saleGoods['goods_num'] = $skuInfo['goods_num']; $saleGoods['sku_name'] = $sku_name; $saleGoods['goods_id'] = $skuInfo['goods_id']; $saleGoods['sku_id'] = $add; $saleGoods['sku_id_list'] = $skuInfo['sku_id_list']; $saleGoods['sku_goods_number'] = $skuInfo['sku_goods_number']; $saleGoods['sku_code'] = $skuInfo['sku_code']; $saleGoods['sku_num'] = $skuInfo['sku_num']; $saleGoods['more_num'] = $skuInfo['more_num']; $saleGoods['less_num'] = $skuInfo['less_num']; $saleGoods['cost_price'] = $skuInfo['purchase_price']; $this->addSaleGoods($saleGoods, 1); //供给仓 1增加 unset($skuInfo); } $res['status'] = 1; $res['msg'] = '规格同步成功'; return $res; } //门店供货商信息 public function StoreSupplierInfo($supplier_id) { $supplierInfo = D("SSupplier")->getFieldInfo(array("id" => $supplier_id), 'advance_money,bank_card,bank_name'); $res = array( 'status' => 1, 'msg' => "查询成功", 'advanceMoney' => $supplierInfo['advance_money'], 'bank_card' => $supplierInfo['bank_card'], 'bank_name' => $supplierInfo['bank_name'], ); return $res; } /*门店付款操作 *@param $payable_id 应付款id *@param $pay_type 付款方式 1预付款方式 2微信3支付宝 4线下 5银行卡 * @param $advance_money 应付款 * @param $pay_money 付款金额 * @param $remarks 备注 * @param $add_time 付款时间 * @param $bank_card 银行卡号 * @param $bank_name 银行名称 * @param $purchase_order_number 采购订单号 * @param supplier_id 供货商id */ public function StorePayment($data, $merchant_id, $store_id, $operator_id) { $SCapitalModel = D("SPurchaseCapital"); $SPayableModel = D("SPurchasePayable"); $SSupplierModel = D("SSupplier"); $payable_id = $data['payable_id']; $pay_type = $data['pay_type']; $advance_money = $data['advance_money']; $pay_money = $data['pay_money']; $remarks = $data['remarks']; $pay_time = $data['add_time']; $bank_card = $data['bank_card']; $bank_name = $data['bank_name']; $purchase_order_number = $data['purchase_order_number']; $supplier_id = $data['supplier_id']; if (!$pay_type || !$pay_money || !$pay_time || !$purchase_order_number || !$supplier_id || !$payable_id) { $res = array( 'status' => 0, 'msg' => '参数缺失' ); return $res; } if ($pay_type == 1 && (!$advance_money || $advance_money < $pay_money)) { $res = array( 'status' => 0, 'msg' => '预付款金额有误' ); return $res; } if ($pay_type == 5 && (!$bank_card || !$bank_name)) { $res = array( 'status' => 0, 'msg' => '银行卡信息或开户银行有误' ); return $res; } $payableInfo = $SPayableModel->getFind(array($SPayableModel::ID => $payable_id)); if (!$payableInfo) { $res = array( 'status' => 0, 'msg' => '未找到改采购应付款订单', ); return $res; } $stay_money = round($payableInfo['payable_money'] - $payableInfo['paid_money'], 2); //待付金额 if ($stay_money <= 0) { $res = array( 'status' => 0, 'msg' => '该采购单应付金额已全部结清,请勿重复操作', ); return $res; } if ($pay_money > $stay_money) { $res = array( 'status' => 0, 'msg' => '付款金额不能大于待付金额', ); return $res; } $content = array( $SCapitalModel::MERCHANT_ID => $merchant_id, $SCapitalModel::STORE_ID => $store_id, $SCapitalModel::SUPPLIER_ID => $supplier_id, $SCapitalModel::OPERATOR_ID => $operator_id, $SCapitalModel::PURCHASE_ORDER_NUMBER => $purchase_order_number, $SCapitalModel::PAY_TYPE => $pay_type, $SCapitalModel::PAY_MONEY => $pay_money, $SCapitalModel::REMARKS => $remarks, $SCapitalModel::PAY_TIME => strtotime($pay_time), $SCapitalModel::ADD_TIME => time() ); if ($pay_type == 5) { $content[$SCapitalModel::BANK_CARD] = $bank_card; $content['bank_name'] = $bank_name; } $res = $SCapitalModel->addData($content); if ($res['status'] == 1) { if ($pay_type == 1) { $SSupplierModel->updateSetDec(array('id' => $supplier_id), "advance_money", $pay_money); } $SPayableModel->updateSetInc(array($SPayableModel::ID => $payable_id), $SPayableModel::PAID_MONEY, $pay_money); if (round($pay_money - $stay_money, 2) == 0) { $able[$SPayableModel::PAY_STATUS] = 3; } else { $able[$SPayableModel::PAY_STATUS] = 2; } $SPayableModel->updateData(array($SPayableModel::ID => $payable_id), $able); $add_id = $res['data']; $order_number = orderNumber($add_id); $res = $SCapitalModel->updateData(array($SCapitalModel::ID => $add_id), array($SCapitalModel::ORDER_NUMBER => $order_number)); } return $res; } //门店资金流水列表 public function StoreCapitalList($where, $page, $limit, $fields) { $SCapitalModel = D("SPurchaseCapital"); $SCapitalList = $SCapitalModel->getSelect($where, $page, $limit, $fields); if ($SCapitalList) { $count = $SCapitalModel->getCount($where); foreach ($SCapitalList as $key => &$val) { $val['index'] = $key + 1; $val['pay_money'] = round($val['pay_money'], 2); $val['pay_time'] = date('Y-m-d H:i:s', $val['pay_time']); $val['add_time'] = date('Y-m-d H:i:s', $val['add_time']); $val['operator_name'] = $this->OperatorName($val['operator_id']); $val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name"); switch ($val[$SCapitalModel::PAY_TYPE]) { case 1: $val['pay_name'] = "预付款方式"; break; case 2: $val['pay_name'] = "微信"; break; case 3: $val['pay_name'] = "支付宝"; break; case 4: $val['pay_name'] = "线下"; break; case 5: $val['pay_name'] = "银行卡"; break; } } } $SCapitalList = $SCapitalList ? $SCapitalList : array(); $count = $count ? $count : 0; $res = array( 'status' => 1, 'msg' => "查询成功", 'data' => $SCapitalList, 'count' => $count ); return $res; } //门店预付款列表 public function StoreAdvanceList($where, $page, $limit, $fields) { $advanceList = D("SSupplier")->getSelect($where, $page, $limit, $fields); if ($advanceList) { $count = D("SSupplier")->getCount($where); foreach ($advanceList as $key => &$val) { $val['index'] = $key + 1; $val['advance_money'] = round($val['advance_money'], 2); } } $advanceList = $advanceList ? $advanceList : array(); $count = $count ? $count : 0; $res = array( 'status' => 1, 'data' => $advanceList, 'count' => $count, 'msg' => "查询成功" ); return $res; } /*门店预付款操作 * @param supplier_id 供货商id * @param type 1增加 2减少 * @param money 金额 */ public function StoreAdvanceOperation($data, $merchant_id, $store_id, $operator_id) { $SSupplierModel = D("SSupplier"); $SAdvanceModel = D("SAdvancePayment"); $reg = '/^[0-9]+(.[0-9]{1,2})?$/'; if (!$data['supplier_id']) { $res = array( 'status' => 0, 'msg' => "参数缺失" ); return $res; } if (empty($data['type'])) { $res = array( 'status' => 0, 'msg' => "请选择预付款类型" ); return $res; } if (empty($data['money']) || !preg_match($reg, $data['money'])) { $res = array( 'status' => 0, 'msg' => "请输入正确金额" ); return $res; } if ($data['money'] > 100000) { $res = array( 'status' => 0, 'msg' => "金额不能超过10万元" ); return $res; } $type = $data['type']; $money = $data['money']; $supplier_id = $data['supplier_id']; $where['id'] = $supplier_id; $advanceMoney = $SSupplierModel->getFindField($where, "advance_money"); switch ($type) { case 1: $success = $SSupplierModel->updateSetInc($where, "advance_money", $money); break; case 2: if (round($advanceMoney - $money, 2) < 0) { $res = array( 'status' => 0, 'msg' => "减少金额不能大于总余额" ); return $res; } $success = $SSupplierModel->updateSetDec($where, "advance_money", $money); break; } if ($success) { $content = array( $SAdvanceModel::MERCHANT_ID => $merchant_id, $SAdvanceModel::STORE_ID => $store_id, $SAdvanceModel::SUPPLIER_ID => $supplier_id, $SAdvanceModel::OPERATOR_ID => $operator_id, $SAdvanceModel::TYPE => $type, $SAdvanceModel::MONEY => $money, $SAdvanceModel::ADD_TIME => time() ); $res = $SAdvanceModel->addData($content); if ($res['status'] == 0) { $res['msg'] = '暂无修改'; } } else { $res = array( 'status' => 0, 'msg' => '暂无改变' ); } return $res; } //门店预付款记录 public function StoreRecord($where, $page, $limit, $fields) { $SAdvanceModel = D("SAdvancePayment"); $recordList = $SAdvanceModel->getSelect($where, $page, $limit, $fields); if ($recordList) { $count = $SAdvanceModel->getCount($where); foreach ($recordList as $key => &$val) { $val['index'] = $key + 1; $val['add_time'] = date("Y-m-d H:i:s", $val['add_time']); $val['money'] = round($val['money'], 2); if ($val['type'] == 1) { $val['type_name'] = "增加"; } else if ($val['type'] == 2) { $val['type_name'] = "减少"; } $val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name"); $val['operator_name'] = $this->OperatorName($val['operator_id']); } } $count = $count ? $count : 0; $recordList = $recordList ? $recordList : array(); $res = array( 'status' => 1, 'msg' => "查询成功", 'data' => $recordList, 'count' => $count ); return $res; } //门店退货应收款列表 public function StoreReceivableList($where, $page, $limit, $fields) { $SRetreatReceivablesModel = D("SRetreatReceivables"); $RetreatList = $SRetreatReceivablesModel->getSelect($where, $page, $limit, $fields); $TotalRetreatList = $SRetreatReceivablesModel->getSelect($where, $page = '', $limit = '', "*"); if ($RetreatList) { $count = $SRetreatReceivablesModel->getCount($where); foreach ($RetreatList as $key => &$val) { $val['index'] = $key + 1; $val[$SRetreatReceivablesModel::RETREAT_TIME] = date("Y-m-d H:i:s", $val[$SRetreatReceivablesModel::RETREAT_TIME]); $val[$SRetreatReceivablesModel::COLLECT_MONEY] = round($val[$SRetreatReceivablesModel::COLLECT_MONEY], 2); $val[$SRetreatReceivablesModel::RECEIVED_MONEY] = round($val[$SRetreatReceivablesModel::RECEIVED_MONEY], 2); $val['stay_money'] = round($val[$SRetreatReceivablesModel::COLLECT_MONEY] - $val[$SRetreatReceivablesModel::RECEIVED_MONEY], 2); $val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val[$SRetreatReceivablesModel::SUPPLIER_ID]), "supplier_name"); $val['operator'] = $this->OperatorName($val[$SRetreatReceivablesModel::OPERATOR_ID]); switch ($val[$SRetreatReceivablesModel::PAY_STATUS]) { case 1: $val['pay_name'] = "待收款"; break; case 2: $val['pay_name'] = "部分收款"; break; case 3: $val['pay_name'] = "已收款"; break; } } unset($val); } $collect_money = 0; //应收 $received_money = 0; //已收 $stay_money = 0; //待收 if ($TotalRetreatList) { foreach ($TotalRetreatList as $val) { $collect_money += $val['collect_money']; $received_money += $val['received_money']; } } $stay_money = round($collect_money - $received_money, 2); $RetreatList = $RetreatList ? $RetreatList : array(); $count = $count ? $count : 0; $TotalList = array( array( 'collect_money' => $collect_money, 'received_money' => $received_money, 'stay_money' => $stay_money ) ); $res = array( 'status' => 1, 'msg' => '查询成功', 'data' => $RetreatList, 'TotalList' => $TotalList, 'count' => $count, ); return $res; } /*门店退货收款 * @param receivables_id 应收款id * @param $pay_type 付款方式 2微信3支付宝 4线下 5银行卡 * @param $collect_money 收款金额 * @param remarks 备注 * @param add_time 收款时间 * @param bank_card 银行卡号 * @param bank_name 银行名称 * @param retreat_order_number 采购退货单号 * @param supplier_id 供货商id */ public function StoreCollect($data, $merchant_id, $store_id, $operator_id) { $SCapitalModel = D("SRetreatCapital"); $SRetreatReceivablesModel = D("SRetreatReceivables"); $receivables_id = $data['receivables_id']; $pay_type = $data['pay_type']; $collect_money = $data['collect_money']; $remarks = $data['remarks']; $collect_time = $data['add_time']; $bank_card = $data['bank_card']; $bank_name = $data['bank_name']; $retreat_order_number = $data['retreat_order_number']; $supplier_id = $data['supplier_id']; if (!$pay_type || !$collect_money || !$collect_time || !$retreat_order_number || !$supplier_id || !$receivables_id) { $res = array( 'status' => 0, 'msg' => '参数缺失' ); return $res; } if ($pay_type == 5 && (!$bank_card || !$bank_name)) { $res = array( 'status' => 0, 'msg' => '银行卡信息或开户银行有误' ); return $res; } $receivableInfo = $SRetreatReceivablesModel->getFind(array($SRetreatReceivablesModel::ID => $receivables_id)); if (!$receivableInfo) { $res = array( 'status' => 0, 'msg' => '未找到改退货收款订单', ); return $res; } $stay_money = round($receivableInfo['collect_money'] - $receivableInfo['received_money'], 2); //待收金额 if ($stay_money <= 0) { $res = array( 'status' => 0, 'msg' => '该退货单应付金额已全部结清,请勿重复操作', ); return $res; } if ($collect_money > $stay_money) { $res = array( 'status' => 0, 'msg' => '收款金额不能大于待收金额', ); return $res; } $content = array( $SCapitalModel::MERCHANT_ID => $merchant_id, $SCapitalModel::STORE_ID => $store_id, $SCapitalModel::SUPPLIER_ID => $supplier_id, $SCapitalModel::OPERATOR_ID => $operator_id, $SCapitalModel::RETREAT_ORDER_NUMBER => $retreat_order_number, $SCapitalModel::PAY_TYPE => $pay_type, $SCapitalModel::COLLECT_MONEY => $collect_money, $SCapitalModel::REMARKS => $remarks, $SCapitalModel::COLLECT_TIME => strtotime($collect_time), $SCapitalModel::ADD_TIME => time() ); if ($pay_type == 5) { $content[$SCapitalModel::BANK_CARD] = $bank_card; $content['bank_name'] = $bank_name; } $res = $SCapitalModel->addData($content); if ($res['status'] == 1) { $SRetreatReceivablesModel->updateSetInc(array($SRetreatReceivablesModel::ID => $receivables_id), $SRetreatReceivablesModel::RECEIVED_MONEY, $collect_money); if (round($collect_money - $stay_money, 2) == 0) { $able[$SRetreatReceivablesModel::PAY_STATUS] = 3; } else { $able[$SRetreatReceivablesModel::PAY_STATUS] = 2; } $SRetreatReceivablesModel->updateData(array($SRetreatReceivablesModel::ID => $receivables_id), $able); $add_id = $res['data']; $order_number = "SS" . orderNumber($add_id); $res = $SCapitalModel->updateData(array($SCapitalModel::ID => $add_id), array($SCapitalModel::ORDER_NUMBER => $order_number)); } return $res; } public function StoreRetreatCapitalList($where, $page, $limit, $fields) { $SRetreatCapitalModel = D("SRetreatCapital"); $CapitalList = $SRetreatCapitalModel->getSelect($where, $page, $limit, $fields); if ($CapitalList) { $count = $SRetreatCapitalModel->getCount($where); foreach ($CapitalList as $key => &$val) { $val['index'] = $key + 1; $val['collect_money'] = round($val['collect_money'], 2); $val['collect_time'] = date('Y-m-d H:i:s', $val['collect_time']); $val['add_time'] = date('Y-m-d H:i:s', $val['add_time']); $val['operator_name'] = $this->OperatorName($val['operator_id']); $val['supplier_name'] = D("SSupplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name"); switch ($val[$SRetreatCapitalModel::PAY_TYPE]) { case 2: $val['pay_name'] = "微信"; break; case 3: $val['pay_name'] = "支付宝"; break; case 4: $val['pay_name'] = "线下"; break; case 5: $val['pay_name'] = "银行卡"; break; } } } $CapitalList = $CapitalList ? $CapitalList : array(); $count = $count ? $count : 0; $res = array( 'status' => 1, 'msg' => "查询成功", 'data' => $CapitalList, 'count' => $count ); return $res; } /** * 门店编辑采购单 * @param $param * [ * id 采购单id * merchant_id * store_id * supplier_type 1普通供货商 2寄售供货商 * modify_price_state 修改售价权限 1关闭 2开启 * supplier_id 供货商id * warehouse_id 仓库id * remarks 备注 * goodsList 商品信息 * ] * @return array */ public function StorePurchaseEdit($param) { $verifyResult = $this->purchaseOrderEditVerify($param); //参数验证 if ($verifyResult['status'] != 1) { $verifyResult['msg'] = $verifyResult['message']; return $verifyResult; } $id = $param['id']; $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $goodsList = $param['goodsList']; $warehouse_id = $param['warehouse_id']; $supplier_id = $param['supplier_id']; $remarks = $param['remarks']; $supplier_type = $param['supplier_type']; $time = $_SERVER['REQUEST_TIME']; try { $SPurchaseOrderModel = new SPurchaseOrderModel(); $purchaseOrder = $SPurchaseOrderModel->getFind(['id' => $id]); if (empty($purchaseOrder)) { return ['status' => 0, 'msg' => '暂无查到该订单']; } $money_total = 0; $SPurchaseGoodsModel = new SPurchaseGoodsModel(); $GoodsModel = new RetailGoodsModel(); $SkuGoodsModel = new RetailSkuGoodsModel(); $SerialClass = new SerialNumberGoods(); $modify_price_state = $param['modify_price_state']; foreach ($goodsList as $val) { $data = [ 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'remarks' => $val['remarks'], 'purchase_price' => $val['purchase_price'], 'purchase_num' => $val['purchase_num'], 'subtotal' => round($val['purchase_price'] * $val['purchase_num'], 2), 'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'], 'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '', ]; if ($val['operated_num'] > 0) { $data['surplus_num'] = round($val['purchase_num'] - $val['operated_num'], 3); } else { $data['surplus_num'] = $val['purchase_num']; //没有操作数量可修改售价 if ($modify_price_state == 2) { if (!empty($val['retail_price'])) { $data['retail_price'] = $val['retail_price']; $goods_price['retail_price'] = $val['retail_price']; } if (!empty($val['online_price'])) { $data['online_price'] = $val['online_price']; $goods_price['online_price'] = $val['online_price']; } } } $result = $SPurchaseGoodsModel->updateData(['id' => $val['id']], $data); //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->purchaseSerialUpdate([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'outside_id' => $val['id'], 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { return ['status' => 0, 'msg' => $serialResult['message']]; } } //修改售价 if ($result['status'] == 1 && $modify_price_state == 2 && !empty($goods_price)) { if ($val['attribute_state'] == 2) { $SkuGoodsModel->updateOrder(['id' => $val['sku_id'], 'goods_id' => $val['goods_id']], $goods_price); } else { $GoodsModel->updateOrder(['id' => $val['goods_id']], $goods_price); } unset($goods_price); } $money_total += round($val['purchase_price'] * $val['purchase_num'] * 1, 2); } $text = [ 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'money_total' => $money_total, 'remarks' => $remarks ]; $SPurchaseOrder = new SPurchaseOrderModel(); $purchaseOrder = $SPurchaseOrder->updateData(['id' => $id], $text); //普通供货商修改资金 if ($purchaseOrder['status'] == 1 && $supplier_type != 2) { $content = [ 'supplier_id' => $supplier_id, 'payable_money' => $money_total ]; $SPurchasePayable = new SPurchasePayableModel(); $SPurchasePayable->updateData(['purchase_order_id' => $id], $content); } return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 门店采购退货提交操作 * @param $param * [ * merchant_id 商户id * store_id 门店id * operator_id 操作人id * remarks 备注 * goodsList 商品信息 * warehouse_id 仓库id * supplier_id 供货商id * ] * @return mixed */ public function StoreRetreatAction($param) { $verifyResult = $this->StoreRetreatActionVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } $operator_id = $param['operator_id']; $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $goodsList = $param['goodsList']; $warehouse_id = $param['warehouse_id']; $supplier_id = $param['supplier_id']; $remarks = $param['remarks']; $time = $_SERVER['REQUEST_TIME']; $data = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'remarks' => $remarks, 'add_time' => $time, 'operator_id' => $operator_id ]; try { M()->startTrans(); $SPurchaseRetreatOrderModel = new SPurchaseRetreatOrderModel(); $retreatOrder = $SPurchaseRetreatOrderModel->addData($data); if ($retreatOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $retreatOrderId = $retreatOrder['data']; $retreatOrderNumber = 'ST' . orderNumber($retreatOrderId); $moneyTotal = 0; //退货总金额 $total_cost_price = 0; //原采购价 $SRetreatGoodsModel = new SRetreatGoodsModel(); $SPurchaseGoodsModel = new SPurchaseGoodsModel(); $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { $content = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'retreat_order_id' => $retreatOrderId, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'add_time' => $time, 'order_number' => $retreatOrderNumber, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_number' => $val['goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'purchase_price' => $val['purchase_price'], 'retreat_price' => $val['retreat_price'], 'retreat_num' => $val['retreat_num_act'], 'subtotal' => round($val['retreat_price'] * $val['retreat_num_act'] * 1, 2), 'remarks' => $val['remarks'], 'purchase_order_number' => $val['order_number'], 'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_goods_number'] = $val['sku_goods_number']; $content['sku_id_list'] = $val['sku_id_list']; } $success = $SRetreatGoodsModel->addData($content); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '采购退货失败']; } //串号商品 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->retreatSerial([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串号操作失败']; } } $moneyTotal += $content['subtotal']; $total_cost_price += round($content['purchase_price'] * $val['retreat_num_act'], 2); $SPurchaseGoodsModel->updateSetDec(array('id' => $val['id']), "surplus_num", $val['retreat_num_act']); $SPurchaseGoodsModel->updateSetInc(array('id' => $val['id']), "retreat_num", $val['retreat_num_act']); } $text = [ 'money_total' => $moneyTotal, 'total_cost_price' => $total_cost_price, 'goods_species' => count($goodsList), 'status' => 1, 'order_number' => $retreatOrderNumber ]; $success = $SPurchaseRetreatOrderModel->updateData(array('id' => $retreatOrderId), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } $content = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'supplier_id' => $supplier_id, 'retreat_order_id' => $retreatOrderId, 'retreat_order_number' => $retreatOrderNumber, 'operator_id' => $operator_id, 'retreat_time' => $time, 'collect_money' => $moneyTotal, 'type' => 1 ]; $SRetreatReceivablesModel = new SRetreatReceivablesModel(); $result = $SRetreatReceivablesModel->addData($content); if ($result['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败,退货资金添加失败']; } $text['operator_id'] = $operator_id; $text['add_time'] = $time; $print_parameter = [ 'id' => $retreatOrderId, 'order_info' => $text, 'identity' => 2, 'type' => 6, 'store_id' => $store_id ]; A('PayApi/Printer')->inventoryPrint($print_parameter); M()->commit(); return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 门店采购退货提交操作的参数验证 * @param $param * [ * merchant_id 商户id * store_id 门店id * operator_id 操作人id * remarks 备注 * goodsList 商品信息 * warehouse_id 仓库id * supplier_id 供货商id * ] * @return mixed */ public function StoreRetreatActionVerify(&$param) { $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); $warehouse_id = $param['warehouse_id']; $supplier_id = $param['supplier_id']; $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; if (empty($goodsList) || empty($warehouse_id) || empty($supplier_id) || empty($merchant_id) || empty($store_id)) { return ['status' => 0, 'msg' => '参数缺失']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单次操作上限为500种商品']; } foreach ($goodsList as $val) { if (!$val['retreat_price']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if (!$val['retreat_num_act']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } if (!preg_match($reg1, $val['retreat_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //称重 if (!preg_match($reg3, $val['retreat_num_act'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['retreat_num_act'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['retreat_num_act'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } if ($val['retreat_num_act'] > $val['surplus_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量不能大于可退数量']; } //串码信息 if ($val['serial_number_state'] == 1) { if (empty($val['serial_list'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请选择串号']; } if (count($val['serial_list']) != $val['retreat_num_act']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量有误']; } } } $param['goodsList'] = $goodsList; return callBack(statusCode()['success'], '验证成功'); } /** * 门店报损 * @param $param * [ * operator_id * merchant_id * store_id * goodsList * remarks * ] * @return mixed */ public function StoreReportSub($param) { $verifyResult = $this->StoreReportSubVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } $warehouse_id = $verifyResult['data']; $time = $_SERVER['REQUEST_TIME']; $goodsList = $param['goodsList']; $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $data = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'remarks' => $param['remarks'], 'add_time' => $time, 'operator_id' => $param['operator_id'], ]; try { M()->startTrans(); $SLossReportOrderModel = new SLossReportOrderModel(); $LossOrder = $SLossReportOrderModel->addData($data); if ($LossOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $LossOrderId = $LossOrder['data']; $LossOrderNumber = "SB" . orderNumber($LossOrderId); $moneyTotal = 0; $SLossReportGoodsModel = new SLossReportGoodsModel(); $SSaleMGoodsModel = new SSaleMGoodsModel(); $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { $content = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'loss_order_id' => $LossOrderId, 'loss_order_number' => $LossOrderNumber, 'add_time' => $time, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'sku_name' => $val['sku_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'loss_price' => $val['cost_price'], 'loss_num' => $val['loss_num'], 'subtotal' => round($val['cost_price'] * $val['loss_num'] * 1, 2), 'remarks' => $val['remarks'], 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } $success = $SLossReportGoodsModel->addData($content); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '记录保存失败']; } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->lossSerial([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'serial_list' => $val['serial_list'], ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => $serialResult['message']]; } } $moneyTotal += $content['subtotal']; $where = [ 'goods_id' => $val['goods_id'], 'merchant_id' => $merchant_id, 'store_id' => $store_id, ]; if ($val['attribute_state'] == 2) { $where['sku_id'] = $val['sku_id']; } $goods_total_num = $SSaleMGoodsModel->getFindField($where, "goods_num"); $SSaleMGoodsModel->updateSetDec($where, "goods_num", $val['loss_num']); if ($goods_total_num > 0) { $ware_arr = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'goods_id' => $val['goods_id'], 'surplus_num' => ['gt', 0], ]; if ($val['attribute_state'] == 2) { $ware_arr['sku_id'] = $val['sku_id']; } $this->WarehouseReduce($ware_arr, $val['loss_num']); //串号信息处理 if ($val['serial_number_state'] == 1) { $serial_id_arr = array_column($val['serial_list'], 'id'); $SerialClass->warehouseSerialDec([ 'user_type' => 4, 'serial_id_arr' => $serial_id_arr, 'type' => 1, 'merchant_id' => $merchant_id, 'store_id' => $store_id ]); } } } $text['money_total'] = $moneyTotal; $text['goods_species'] = count($goodsList); $text['status'] = 1; $text['order_number'] = $LossOrderNumber; $success = $SLossReportOrderModel->updateData(array('id' => $LossOrderId), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } M()->commit(); return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 门店报损提交验证 * @param $param * [ * operator_id * merchant_id * store_id * goodsList * remarks * ] * @return mixed */ public function StoreReportSubVerify(&$param) { $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $operator_id = $param['operator_id']; $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); if (empty($goodsList) || empty($merchant_id) || empty($store_id) || empty($operator_id)) { return ['status' => 0, 'msg' => '参数缺失']; } //销售仓库 $SSaleWarehouseModel = new SSaleWarehouseModel(); $warehouse_id = $SSaleWarehouseModel->getFindField(array('merchant_id' => $merchant_id, 'store_id' => $store_id, 'status' => 1), "id"); if (empty($warehouse_id)) { return ['status' => 0, 'msg' => '请先创建供给仓']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单次操作上限为500种商品']; } foreach ($goodsList as $key => &$val) { if (!$val['cost_price']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '成本价有误']; } if (!preg_match($reg1, $val['cost_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['loss_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['loss_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['loss_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } if ($val['loss_num'] > $val['goods_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '报损数量不能大于辅助数量']; } //串号信息 if ($val['serial_number_state'] == 1) { if (empty($val['serial_list']) || count($val['serial_list']) != $val['loss_num']) { return ['status' => 0, 'msg' => '请选择报损的串号信息']; } } } $param['goodsList'] = $goodsList; return callBack(statusCode()['success'], '验证成功', $warehouse_id); } //门店报损详情 2021-1-29 已作废 public function StoreReportDetails() { $id = I("post.id"); $where['loss_order_id'] = $id; $detailsList = D('SLossReportGoods')->getSelect($where, $page = '', $limit = ''); if ($detailsList) { foreach ($detailsList as $key => &$val) { $val['index'] = $key + 1; $val['loss_num'] = round($val['loss_num'], 3); $val['loss_price'] = round($val['loss_price'], 2); $val['subtotal'] = round($val['subtotal'], 2); $val['sku_num'] = round($val['sku_num'], 3); if ($val['attribute_state'] == 2) { $val['goods_code'] = $val['sku_code']; $val['goods_number'] = $val['sku_goods_number']; } } } $res['data'] = $detailsList; $res['status'] = 1; return $res; } /** * 获取门店采购选择的商品列表 作废时间2021-1-27 * @param $param * [ * merchant_id * store_id * person1 * person2 * person3 * searchText 搜索的名称货号条码 * notInIds 排除的id * page * limit * ] * @return array */ public function getStoreSaleGoodsList($param) { $goodsClass = new GoodsClassify(); $where = $goodsClass->getGoodsClassId($param, [], 'goods_class_id'); //获取分类id if (!empty($param['searchText'])) { $where['goods_number|sku_goods_number|goods_code|sku_code|goods_name|sku_name'] = array('like', '%' . $param['searchText'] . '%'); } if (!empty($param['notInIds'])) { $where['id'] = array('not in', $param['notInIds']); } $where['merchant_id'] = $param['merchant_id']; $where['store_id'] = $param['store_id']; $where['status'] = array('in', array(0, 1)); $SaleGoodsModel = new SSaleMGoodsModel(); $list = $SaleGoodsModel->getSelect($where, $param['page'], $param['limit'], "*", "goods_num asc"); if (!empty($list)) { $count = $SaleGoodsModel->getCount($where); $goodsModel = new RetailGoodsModel(); $skuGoodsModel = new RetailSkuGoodsModel(); $purchaseGoodsModel = new SPurchaseGoodsModel(); foreach ($list as $key => &$value) { $value['purchase_num'] = ""; //进货数量 $value['goods_num'] = round($value['goods_num'], 3); if ($value['attribute_state'] == 2) { //规格 $goods = $skuGoodsModel->getFind([ 'goods_id' => $value['goods_id'], 'id' => $value['sku_id'] ], 'retail_price,online_price'); } else { //无规格 $goods = $goodsModel->getFind(array('id' => $value['goods_id']), "retail_price,online_price"); } $value['retail_price'] = $goods['retail_price'] ? round($goods['retail_price'], 2) : ''; //线下价 $value['online_price'] = $goods['online_price'] ? round($goods['online_price'], 2) : ''; //线上价 $map = [ 'goods_id' => $value['goods_id'] ]; if ($value['attribute_state'] == 2) { $map['sku_id'] = $value['sku_id']; } $purchase_info = $purchaseGoodsModel->getFind($map, "id desc"); if (!empty($purchase_info)) { $value['purchase_price'] = round($purchase_info['purchase_price'], 2); } else { $value['purchase_price'] = round($value['cost_price'], 2); } } } return callBack(statusCode()['success'], '查询成功', [ 'list' => $list ? $list : [], 'count' => $count ? $count : 0 ]); } /** * 门店采购提交参数验证 * @param $param * [ * merchant_id * store_id * goodsList * supplier_id 供货商id * warehouse_id 仓库id * remarks 备注 * type 1采购 2补采 * add_time 补采时间 * supplier_type 供货商类型 1普通供货商 2寄售供货商 * operator_id 操作人id * modify_price_state modify_price_state * ] * @return array */ public function storePurchaseVerify(&$param) { $warehouse_id = $param['warehouse_id']; $supplier_id = $param['supplier_id']; $type = $param['type']; if (is_array($param['goodsList'])) { $goodsList = $param['goodsList']; } else { $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); } $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; if (empty($goodsList) || empty($warehouse_id) || empty($supplier_id) || empty($type)) { return ['status' => 0, 'msg' => '参数错误']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单次操作上限为500种商品']; } $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期']; } if (!$val['purchase_price']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if (!$val['purchase_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } if (!preg_match($reg1, $val['purchase_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { if (!preg_match($reg3, $val['purchase_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['purchase_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['purchase_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } //串号验证 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->serialVerify([ 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $serialResult['message']]; } if ($val['purchase_num'] != count($val['serial_list'])) { return ['status' => 0, 'msg' => '请输入正确的数量']; } } } $param['goodsList'] = $goodsList; return callBack(statusCode()['success'], '验证成功'); } /** * 门店采购提交操作 * @param $param * [ * merchant_id * store_id * goodsList * supplier_id 供货商id * warehouse_id 仓库id * remarks 备注 * type 1采购 2补采 * add_time 补采时间 * supplier_type 供货商类型 1普通供货商 2寄售供货商 * operator_id 操作人id * modify_price_state 编辑售价 1关闭 2开启 * ] * @return array */ public function storePurchaseOperation($param) { $result = $this->storePurchaseVerify($param); if ($result['status'] == 0) { return $result; } $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $goodsList = $param['goodsList']; $supplier_id = $param['supplier_id']; $warehouse_id = $param['warehouse_id']; $remarks = $param['remarks']; $type = $param['type']; $add_time = $param['add_time']; $supplier_type = $param['supplier_type']; $operator_id = $param['operator_id']; $time = $_SERVER['REQUEST_TIME']; $modify_price_state = $param['modify_price_state']; $data = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'remarks' => $remarks, 'type' => $type, 'operator_id' => $operator_id, 'repair_time' => $time ]; if ($type == 2) { //补采购单 $data['add_time'] = strtotime($add_time); } else { $data['add_time'] = $time; } try { M()->startTrans(); $PurchaseOrderModel = new SPurchaseOrderModel(); $purchaseOrder = $PurchaseOrderModel->addData($data); if ($purchaseOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $purchaseOrderId = $purchaseOrder['data']; $purchaseOrderNumber = 'SC' . orderNumber($purchaseOrderId); $moneyTotal = 0; $SPurchaseGoodsModel = new SPurchaseGoodsModel(); $GoodsModel = new RetailGoodsModel(); $skuGoodsModel = new RetailSkuGoodsModel(); $SerialNumberGoodsClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { $content = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'purchase_order_id' => $purchaseOrderId, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'order_number' => $purchaseOrderNumber, 'add_time' => $time, 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_class_id' => $val['goods_class_id'], 'goods_number' => $val['goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'purchase_price' => $val['purchase_price'], 'purchase_num' => $val['purchase_num'], 'surplus_num' => $val['purchase_num'], 'subtotal' => round($val['purchase_price'] * $val['purchase_num'] * 1, 2), 'remarks' => $val['remarks'], 'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'retail_price' => $val['retail_price'] ? round($val['retail_price'], 2) : null, 'online_price' => $val['online_price'] ? round($val['online_price'], 2) : null, 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0, 'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '', ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_goods_number'] = $val['sku_goods_number']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; $content['sku_name'] = $val['sku_name']; } $success = $SPurchaseGoodsModel->addData($content); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '采购失败']; } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialNumberGoodsClass->purchaseSerial([ 'user_type' => 4, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'] ? $val['sku_id'] : 0, 'type' => 1, 'add_time' => $time, 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串码信息录入失败']; } } $moneyTotal += $content['subtotal']; //修改售价 if ($modify_price_state == 2 && (!empty($val['retail_price']) || !empty($val['online_price']))) { if (!empty($val['retail_price'])) { $goods_price['retail_price'] = $val['retail_price']; } if (!empty($val['online_price'])) { $goods_price['online_price'] = $val['online_price']; } if ($val['attribute_state'] == 2) { $skuGoodsModel->updateOrder(array('goods_id' => $val['goods_id'], 'id' => $val['sku_id']), $goods_price); } else { $GoodsModel->updateOrder(array('id' => $val['goods_id']), $goods_price); } unset($goods_price); } } $text['money_total'] = $moneyTotal; $text['goods_species'] = count($goodsList); $text['status'] = 1; $text['order_number'] = $purchaseOrderNumber; $success = $PurchaseOrderModel->updateData(array('id' => $purchaseOrderId), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } $content = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'supplier_id' => $supplier_id, 'purchase_order_id' => $purchaseOrderId, 'purchase_order_number' => $purchaseOrderNumber, 'operator_id' => $operator_id, 'purchase_time' => $time, ]; if ($supplier_type == 2) { $content['payable_money'] = 0; } else { $content['payable_money'] = $moneyTotal; } $SPurchasePayable = new SPurchasePayableModel(); $success = $SPurchasePayable->addData($content); if ($success['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '应付款订单生成失败']; } M()->commit(); return ['status' => 1, 'msg' => '操作成功', 'data' => [ 'money_total' => $text['money_total'], 'goods_species' => $text['goods_species'], 'order_number' => $text['order_number'], 'id' => $purchaseOrderId ]]; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 门店采购全部入库 * @param $param * [ * operator_id 操作人id * merchant_id * store_id * id 采购单id * ] * @return mixed */ public function storePurchaseWarehouse($param) { $id = $param['id']; $merchant_id = $param['merchant_id']; $store_id = $param['store_id']; $operator_id = $param['operator_id']; try { $SPurchaseOrderModel = new SPurchaseOrderModel(); $purOrderInfo = $SPurchaseOrderModel->getFind(['id' => $id]); if (empty($purOrderInfo)) { return ['status' => 0, 'msg' => '未找到该采购单']; } if ($purOrderInfo['warehouse_state'] == 1) { return ['status' => 0, 'msg' => '该订单已入库,请刷新重试']; } if (C('IS_SET_REDIS')) { $redis_key = 'retail_merchant_id_' . $merchant_id . '_store_id_' . $store_id . '_purchase_order_id_' . $id; $CacheClass = new CacheHandle(); $state = $CacheClass->deposit($redis_key); if ($state == 1) { return ['status' => 0, 'msg' => '该订单正在操作中,请稍后刷新重试']; } $CacheClass->addRedis($redis_key, $id, 300); } $where = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'purchase_order_id' => $id, 'surplus_num' => ['gt', 0] ]; $SPurchaseGoodsModel = new SPurchaseGoodsModel(); $goodsList = $SPurchaseGoodsModel->getSelect($where); if (!empty($goodsList)) { $supplier_id = $purOrderInfo['supplier_id']; //销售仓库 $SSaleWarehouseModel = new SSaleWarehouseModel(); $warehouse_id = $SSaleWarehouseModel->getFindField(['merchant_id' => $merchant_id, 'store_id' => $store_id, 'status' => 1], "id"); if (!$warehouse_id) { return ['status' => 0, 'msg' => '请先创建供给仓']; } $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { $val['warehouse_num'] = round($val['surplus_num'], 3); $val['warehouse_price'] = round($val['purchase_price'], 2); //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->returnableSerialList([ 'user_type' => 4, 'id' => $val['id'] ]); $val['serial_list'] = $serialResult['data']['list']; } } $remarks = $purOrderInfo['remarks']; $data = [ 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'operator_id' => $operator_id, 'supplier_id' => $supplier_id, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'type' => 1, 'goodsList' => $goodsList, 'stock' => 1, 'purchase_order_id' => $id ]; $success = $this->Warehousing($data); if ($success['status'] == 0) { return ['status' => 0, 'msg' => '操作失败']; } } $SPurchaseOrderModel->updateData(array('id' => $id), array('warehouse_state' => 1)); return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /* * *******************************************商户模块******************************************* */ /* * 商户供给仓库商品信息新增与编辑 * @param $goods 商品信息 * @param $type 1 新增 2编辑 * */ public function merAddSaleGoods($goods, $type) { $goods['attribute_state'] = $goods['attribute_state'] ? $goods['attribute_state'] : 1; $goods['pricing_method'] = $goods['pricing_method'] ? $goods['pricing_method'] : 1; $content = array( 'merchant_id' => $goods['merchant_id'], 'warehouse_id' => $goods['warehouse_id'], 'goods_class_id' => $goods['goods_class_id'], 'goods_id' => $goods['goods_id'], 'goods_name' => $goods['goods_name'], 'goods_number' => $goods['goods_number'], 'goods_code' => $goods['goods_code'], 'company' => $goods['company'], 'specifications' => $goods['specifications'], 'attribute_state' => $goods['attribute_state'], 'pricing_method' => $goods['pricing_method'], 'goods_brand_id' => $goods['goods_brand_id'], 'goods_yieldly_id' => $goods['goods_yieldly_id'], 'goods_num' => $goods['goods_num'], 'more_num' => $goods['more_num'], 'less_num' => $goods['less_num'], 'status' => $goods['status'], 'cost_price' => $goods['purchase_price'] ); if ($type == 1) { $content['add_time'] = $goods['add_time'] ? $goods['add_time'] : time(); } if ($content['attribute_state'] == 2) { $content['sku_id'] = $goods['sku_id']; $content['sku_name'] = $goods['sku_name']; $content['sku_id_list'] = $goods['sku_id_list']; $content['sku_goods_number'] = $goods['sku_goods_number']; $content['sku_code'] = $goods['sku_code']; $content['sku_num'] = $goods['sku_num']; } if ($type == 2) { $where = array(); $where['goods_id'] = $goods['goods_id']; if ($goods['attribute_state'] == 2) { $where['sku_id'] = $goods['sku_id']; } unset($content['goods_num']); unset($content['cost_price']); unset($content['add_time']); $res = D('SaleMGoods')->updateData($where, $content); } else if ($type == 1) { $res = D('SaleMGoods')->addData($content); } if ($type == 1) { if ($content['goods_num'] > 0) { //库存大于0存入销售仓库 $content['warehouse_price'] = $content['cost_price']; $content['warehouse_num'] = $content['goods_num']; $content['surplus_num'] = $content['goods_num']; $content['subtotal'] = round($content['warehouse_num'] * $content['warehouse_price'], 2); $content['remarks'] = "初始化库存"; $content['type'] = 5; unset($content['specifications']); unset($content['goods_brand_id']); unset($content['goods_yieldly_id']); unset($content['goods_num']); unset($content['more_num']); unset($content['less_num']); unset($content['status']); unset($content['cost_price']); $res = D('WarehousingGoods')->addData($content); if ($res['status'] == 0) { $res['msg'] = "商品初始化库存添加失败"; $this->ajaxReturn($res); } //初始成本价添加 $cost = array( 'merchant_id' => $goods['merchant_id'], 'cost_price' => $goods['purchase_price'], 'goods_id' => $goods['goods_id'], 'purchase_price' => $goods['purchase_price'], 'goods_class_id' => $goods['goods_class_id'], 'attribute_state' => $goods['attribute_state'], 'pricing_method' => $goods['pricing_method'], 'add_time' => $goods['add_time'], ); if ($cost['attribute_state'] == 2) { $cost['sku_id'] = $goods['sku_id']; } $res = D('CostPriceRecord')->addData($cost); if ($res['status'] == 0) { $res['msg'] = '商品成本价添加失败'; $this->ajaxReturn($res); } } } else if ($type == 2) { $where = array(); $where['merchant_id'] = $content['merchant_id']; $where['goods_id'] = $content['goods_id']; $where['type'] = 5; if ($content['attribute_state'] == 2) { $where['sku_id'] = $content['sku_id']; } D('WarehousingGoods')->updateData($where, $content); } } /** * 获取商户采购选择的商品列表 * @param $parameter * @return array */ public function getMerchantSaleGoodsList($parameter) { $merchant_id = $parameter['merchant_id']; //商户id $searchText = $parameter['searchText']; //搜索的名称货号条码 $notInIds = $parameter['notInIds']; //排除的id $page = $parameter['page']; $limit = $parameter['limit']; if (!empty($searchText)) { $where['goods_number|sku_goods_number|goods_code|sku_code|goods_name|sku_name'] = array('like', '%' . $searchText . '%'); } $goodsClass = new GoodsClassify(); $result = $goodsClass::getGoodsClassId($parameter, $where, 'goods_class_id'); //获取分类id if ($result) { $where = $result; } if (!empty($notInIds)) { $where['id'] = array('not in', $notInIds); } $where['merchant_id'] = $merchant_id; $where['status'] = array('in', array(0, 1)); $info = D('SaleMGoods')->getSelect($where, $page, $limit, $field = '', $order = "goods_num asc"); if ($info) { $count = D('SaleMGoods')->getCount($where); $goodsModel = new RetailMgoodsModel(); foreach ($info as $key => &$value) { $value['purchase_num'] = ""; //进货数量 $value['goods_num'] = round($value['goods_num'], 3); $value['build_date'] = ""; $value['quality_guarantee_period'] = ""; if ($value['attribute_state'] == 2) { //规格 $goods = M('retail_sku_mgoods')->field("retail_price,online_price")->where(array('mgoods_id' => $value['goods_id'], 'id' => $value['sku_id']))->find(); } else { //无规格 $goods = $goodsModel->getFind(array('id' => $value['goods_id']), "retail_price,online_price"); } $value['retail_price'] = $goods['retail_price'] ? round($goods['retail_price'], 2) : ''; //线下价 $value['online_price'] = $goods['online_price'] ? round($goods['online_price'], 2) : ''; //线上价 //默认采购价 $map = array(); $map['goods_id'] = $value['goods_id']; if ($value['attribute_state'] == 2) { $map['sku_id'] = $value['sku_id']; } $purchase_info = D('PurchaseGoods')->getFind($map, "id desc"); if (!empty($purchase_info)) { $value['purchase_price'] = round($purchase_info['purchase_price'], 2); } else { $value['purchase_price'] = round($value['cost_price'], 2); } } } return array( 'info' => $info, 'count' => $count ? $count : 0 ); } /** * 商户采购单验证参数 * @param $param * [ * operator_id * merchant_id * supplier_id 供货商id * warehouse_id 仓库id * type 1常规订单 2补采 * add_time * goodsList * remarks * ] * @return array */ protected function merchantPurchaseOperationVerify(&$param) { $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; if (empty($param['merchant_id']) || empty($goodsList) || empty($param['warehouse_id']) || empty($param['supplier_id']) || empty($param['type'])) { return ['status' => 0, 'msg' => '参数缺失']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单次操作上限为500种商品']; } $serial_arr = []; $SerialNumberGoodsClass = new SerialNumberGoods(); foreach ($goodsList as $val) { if (!empty($val['quality_guarantee_period']) && !preg_match("/^[0-9]*[1-9][0-9]*$/", $val['quality_guarantee_period'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期']; } if (!$val['purchase_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } if (!preg_match($reg1, $val['purchase_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if (!empty($val['retail_price']) && !preg_match($reg1, $val['retail_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确店内零售价']; } if (!empty($val['online_price']) && !preg_match($reg1, $val['online_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确商城零售价']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { if (!preg_match($reg3, $val['purchase_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['purchase_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['purchase_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } //串码验证 if ($val['serial_number_state'] == 1) { if ($val['purchase_num'] != count($val['serial_list'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '串号信息数量不足']; } $numberResult = $SerialNumberGoodsClass->serialVerify([ 'serial_list' => $val['serial_list'], 'data' => $serial_arr ]);//串码验证 if ($numberResult['status'] != 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $numberResult['message']]; } $serial_arr = $numberResult['data']; } } $param['goodsList'] = $goodsList; return ['status' => 1, 'msg' => '验证成功']; } /** * 商户采购提交 * @param $param * [ * operator_id * merchant_id * modify_price_state 编辑售价 1关闭 2开启 * supplier_id 供货商id * warehouse_id 仓库id * type 1常规订单 2补采 * add_time * goodsList * remarks * ] * @return mixed */ public function merchantPurchaseOperation($param) { $result = $this->merchantPurchaseOperationVerify($param); //参数验证 if ($result['status'] == 0) { return $result; } $merchant_id = $param['merchant_id']; $goodsList = $param['goodsList']; $supplier_id = $param['supplier_id']; $warehouse_id = $param['warehouse_id']; $remarks = $param['remarks']; $type = $param['type']; $add_time = $param['add_time']; $operator_id = $param['operator_id']; $modify_price_state = $param['modify_price_state'] ? $param['modify_price_state'] : 1; //修改售价权限默认关闭 $time = $_SERVER['REQUEST_TIME']; $PurchaseOrderModel = new PurchaseOrderModel(); $PurchaseGoodsModel = new PurchaseGoodsModel(); $SerialNumberGoodsClass = new SerialNumberGoods(); $GoodsModel = new RetailMgoodsModel(); $SkuGoodsModel = new SkuMGoodsModel(); $data = [ 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'remarks' => $remarks, 'type' => $type, 'repair_time' => $time, 'operator_id' => $operator_id, ]; if ($type == 2) { //补采购单 $data['add_time'] = strtotime($add_time); } else { $data['add_time'] = $time; } //创建采购单 try { M()->startTrans(); $purchaseOrder = $PurchaseOrderModel->addData($data); if ($purchaseOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $purchaseOrderId = $purchaseOrder['data']; $purchaseOrderNumber = 'MC' . orderNumber($purchaseOrderId); $moneyTotal = 0; foreach ($goodsList as $key => &$val) { $content = [ 'merchant_id' => $merchant_id, 'purchase_order_id' => $purchaseOrderId, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'order_number' => $purchaseOrderNumber, 'add_time' => $time, 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_class_id' => $val['goods_class_id'], 'goods_number' => $val['goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'purchase_price' => $val['purchase_price'], 'purchase_num' => $val['purchase_num'], 'surplus_num' => $val['purchase_num'], 'subtotal' => round($val['purchase_price'] * $val['purchase_num'] * 1, 2), 'remarks' => $val['remarks'], 'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0, 'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '', ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_goods_number'] = $val['sku_goods_number']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; $content['sku_name'] = $val['sku_name']; } //开启修改售价 if ($modify_price_state == 2) { $content['retail_price'] = $val['retail_price'] ? $val['retail_price'] : null; $content['online_price'] = $val['online_price'] ? $val['online_price'] : null; } $success = $PurchaseGoodsModel->addData($content); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '采购失败']; } //添加串码信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialNumberGoodsClass->purchaseSerial([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'] ? $val['sku_id'] : 0, 'type' => 1, 'add_time' => $time, 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串码信息录入失败']; } } $moneyTotal += $content['subtotal']; //修改商品价格 if ($modify_price_state == 2 && (!empty($val['retail_price']) || !empty($val['online_price']))) { if (!empty($val['retail_price'])) { $goods_price['retail_price'] = $val['retail_price']; } if (!empty($val['online_price'])) { $goods_price['online_price'] = $val['online_price']; } if ($val['attribute_state'] == 2) { $SkuGoodsModel->updateOrder([ 'mgoods_id' => $val['goods_id'], 'id' => $val['sku_id'] ], $goods_price); } else { $GoodsModel->updateOrder(array('id' => $val['goods_id']), $goods_price); } unset($goods_price); } } $moneyTotal = round($moneyTotal, 2); $text = array( 'money_total' => $moneyTotal, 'goods_species' => count($goodsList), 'status' => 1, 'order_number' => $purchaseOrderNumber ); $success = $PurchaseOrderModel->updateData(array('id' => $purchaseOrderId), $text); if ($success['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } $content = [ 'merchant_id' => $merchant_id, 'supplier_id' => $supplier_id, 'purchase_order_id' => $purchaseOrderId, 'purchase_order_number' => $purchaseOrderNumber, 'operator_id' => session("jurisdiction_user")['id'], 'purchase_time' => $time, 'payable_money' => $moneyTotal, ]; $PurchasePayableModel = new PurchasePayableModel(); $success = $PurchasePayableModel->addData($content); if ($success['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '应付款生成失败']; } M()->commit(); return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 商户编辑采购单提交操作 * @param $param * [ * id 采购单id * merchant_id * modify_price_state 修改售价权限 1关闭 2开启 * supplier_id 供货商id * warehouse_id 仓库id * remarks 备注 * goodsList 商品信息 * ] * @return array */ public function purchaseOrderEdit($param) { $verifyResult = $this->purchaseOrderEditVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return ['status' => 0, 'msg' => $verifyResult['message']]; } $id = $param['id']; $merchant_id = $param['merchant_id']; $modify_price_state = $param['modify_price_state']; $goodsList = $param['goodsList']; $supplier_id = $param['supplier_id']; $warehouse_id = $param['warehouse_id']; $remarks = $param['remarks']; $time = $_SERVER['REQUEST_TIME']; try { $PurchaseOrderModel = new PurchaseOrderModel(); $purchaseOrder = $PurchaseOrderModel->getFind(['id' => $id]); if (empty($purchaseOrder)) { return ['status' => 0, 'msg' => '暂无查到该订单']; } $money_total = 0; $PurchaseGoodsModel = new PurchaseGoodsModel(); $GoodsModel = new RetailMgoodsModel(); $SkuGoodsModel = new SkuMGoodsModel(); $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { $data = [ 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'remarks' => $val['remarks'], 'purchase_price' => $val['purchase_price'], 'purchase_num' => $val['purchase_num'], 'subtotal' => round($val['purchase_price'] * $val['purchase_num'], 2), 'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'goods_batch_number' => $val['goods_batch_number'] ? $val['goods_batch_number'] : '', ]; if ($val['operated_num'] > 0) { $data['surplus_num'] = round($val['purchase_num'] - $val['operated_num'], 3); } else { $data['surplus_num'] = $val['purchase_num']; //修改售价 if ($modify_price_state == 2) { if (!empty($val['retail_price'])) { $data['retail_price'] = $val['retail_price']; $goods_price['retail_price'] = $val['retail_price']; } if (!empty($val['online_price'])) { $data['online_price'] = $val['online_price']; $goods_price['online_price'] = $val['online_price']; } } } $result = $PurchaseGoodsModel->updateData(array('id' => $val['id']), $data); //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->purchaseSerialUpdate([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'outside_id' => $val['id'], 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { return ['status' => 0, 'msg' => $serialResult['message']]; } } //修改售价 if ($result['status'] == 1 && $modify_price_state == 2 && !empty($goods_price)) { if ($val['attribute_state'] == 2) { $SkuGoodsModel->updateOrder(['mgoods_id' => $val['goods_id'], 'id' => $val['sku_id']], $goods_price); } else { $GoodsModel->updateOrder(array('id' => $val['goods_id']), $goods_price); } unset($goods_price); } $money_total += round($val['purchase_price'] * $val['purchase_num'] * 1, 2); } $money_total = round($money_total, 2); $text = array( 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'money_total' => $money_total, 'remarks' => $remarks ); $purchaseOrder = $PurchaseOrderModel->updateData(array('id' => $id), $text); if ($purchaseOrder['status'] == 1) { $content = [ 'supplier_id' => $supplier_id, 'payable_money' => $money_total ]; $PurchasePayableModel = new PurchasePayableModel(); $PurchasePayableModel->updateData(array('purchase_order_id' => $id), $content); } return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 编辑采购单提交操作的参数验证 * @param $param * [ * id 采购单id * supplier_id 供货商id * warehouse_id 仓库id * remarks 备注 * goodsList 商品信息 * ] * @return mixed */ public function purchaseOrderEditVerify(&$param) { $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); if (empty($goodsList) || empty($param['id']) || empty($param['warehouse_id']) || empty($param['supplier_id'])) { return callBack(statusCode()['error'], '请选择必要选项'); } $SerialClass = new SerialNumberGoods(); $data = []; foreach ($goodsList as $key => $val) { //串号信息验证 if ($val['serial_number_state'] == 1) { if (empty($val['serial_list'])) { return callBack(statusCode()['error'], $val['goods_name'] . $val['sku_name'] . '请输入串号信息'); } $serialResult = $SerialClass->serialVerify([ 'serial_list' => $val['serial_list'], 'data' => $data ]); if ($serialResult['status'] != 1) { return $serialResult; } if ($val['purchase_num'] != count($val['serial_list'])) { return callBack(statusCode()['error'], $val['goods_name'] . $val['sku_name'] . '采购数量有误'); } $data = $serialResult['data']; } } $param['goodsList'] = $goodsList; return callBack(statusCode()['success'], '验证成功'); } /** * 商户采购入库到供给仓 * @param $param * [ * operator_id * merchant_id * id 采购单id * ] * @return mixed */ public function MerPurchaseWarehouse($param) { $operator_id = $param['operator_id']; $merchant_id = $param['merchant_id']; $id = $param['id']; try { $PurchaseOrderModel = new PurchaseOrderModel(); $PurchaseGoodsModel = new PurchaseGoodsModel(); $purOrderInfo = $PurchaseOrderModel->getFind(array('id' => $id)); if (empty($purOrderInfo)) { return ['status' => 0, 'msg' => '未找到该采购单']; } if ($purOrderInfo['warehouse_state'] == 1) { return ['status' => 0, 'msg' => '该采购单已入库请刷新重试']; } //验证 if (C('IS_SET_REDIS')) { $redis_key = 'retail_merchant_id_' . $merchant_id . '_purchase_order_id_' . $id; $CacheClass = new CacheHandle(); $state = $CacheClass->deposit($redis_key); if ($state == 1) { return ['status' => 0, 'msg' => '正在操作该订单,请稍后刷新重试']; } $CacheClass->addRedis($redis_key, $id, 300); } $where['merchant_id'] = $merchant_id; $where['purchase_order_id'] = $id; $where['surplus_num'] = array('gt', 0); $goodsList = $PurchaseGoodsModel->getSelect($where); if (!empty($goodsList)) { $supplier_id = $purOrderInfo['supplier_id']; $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { $val['warehouse_num'] = round($val['surplus_num'], 3); $val['warehouse_price'] = round($val['purchase_price'], 2); if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->returnableSerialList([ 'user_type' => 3, 'id' => $val['id'] ]); $val['serial_list'] = $serialResult['data']['list']; } } $remarks = $purOrderInfo['remarks']; $data = [ 'merchant_id' => $merchant_id, 'operator_id' => $operator_id, 'supplier_id' => $supplier_id, 'remarks' => $remarks, 'goodsList' => $goodsList, 'type' => 1, 'stock' => 1 ]; $success = $this->MerWarehousing($data); if ($success['status'] == 0) { return ['status' => 0, 'msg' => $success['msg']]; } } $result = $PurchaseOrderModel->updateData(array('id' => $id), array('warehouse_state' => 1)); if ($result) { return ['status' => 1, 'msg' => '入库成功']; } else { return ['status' => 0, 'msg' => '入库失败']; } } catch (\Exception $e) { return ['status' => 0, 'msg' => '入库失败']; } } /** * 商户采购退货操作 * @param $param * [ * merchant_id * operator_id 操作人id * goodsList 商品信息 * supplier_id 供货商id * warehouse_id 仓库id * remarks 备注 * ] * @return array|mixed */ public function MerRetreatAction($param) { $verifyResult = $this->MerRetreatActionVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } $merchant_id = $param['merchant_id']; $operator_id = $param['operator_id']; $goodsList = $param['goodsList']; $supplier_id = $param['supplier_id']; $warehouse_id = $param['warehouse_id']; $remarks = $param['remarks']; $time = $_SERVER['REQUEST_TIME']; $RetreatOrderModel = new PurchaseRetreatOrderModel(); $RetreatGoodsModel = new RetreatGoodsModel(); $PurchaseGoodsModel = new PurchaseGoodsModel(); $RetreatReceivablesModel = new RetreatReceivablesModel(); $SerialClass = new SerialNumberGoods(); $data = [ 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'remarks' => $remarks, 'add_time' => $time, 'operator_id' => $operator_id ]; try { M()->startTrans(); $retreatOrder = $RetreatOrderModel->addData($data); if ($retreatOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $retreatOrderId = $retreatOrder['data']; $retreatOrderNumber = 'MT' . orderNumber($retreatOrderId); $moneyTotal = 0; //退货总价 $total_cost_price = 0; //原采购价合计 foreach ($goodsList as $key => &$val) { $content = [ 'merchant_id' => $merchant_id, 'retreat_order_id' => $retreatOrderId, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'add_time' => $time, 'order_number' => $retreatOrderNumber, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_number' => $val['goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'purchase_price' => $val['purchase_price'], 'retreat_price' => $val['retreat_price'], 'retreat_num' => $val['retreat_num_act'], 'subtotal' => round($val['retreat_price'] * $val['retreat_num_act'] * 1, 2), 'remarks' => $val['remarks'], 'purchase_order_number' => $val['order_number'], 'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'], 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0, ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_goods_number'] = $val['sku_goods_number']; $content['sku_id_list'] = $val['sku_id_list']; } $success = $RetreatGoodsModel->addData($content); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '采购退货失败']; } //串号商品 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->retreatSerial([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串号操作失败']; } } $moneyTotal += $content['subtotal']; $total_cost_price += round($content['purchase_price'] * $val['retreat_num_act'], 2); $PurchaseGoodsModel->updateSetDec(array('id' => $val['id']), "surplus_num", $val['retreat_num_act']); $PurchaseGoodsModel->updateSetInc(array('id' => $val['id']), "retreat_num", $val['retreat_num_act']); } $text = [ 'money_total' => $moneyTotal, 'total_cost_price' => $total_cost_price, 'goods_species' => count($goodsList), 'status' => 1, 'order_number' => $retreatOrderNumber ]; $success = $RetreatOrderModel->updateData(array('id' => $retreatOrderId), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } $content = [ 'merchant_id' => $merchant_id, 'supplier_id' => $supplier_id, 'retreat_order_id' => $retreatOrderId, 'retreat_order_number' => $retreatOrderNumber, 'operator_id' => $operator_id, 'retreat_time' => $time, 'collect_money' => $moneyTotal, 'type' => 1 ]; $result = $RetreatReceivablesModel->addData($content); if ($result['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } M()->commit(); return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 商户采购退货操作的参数验证 * @param $param * [ * [ * merchant_id * operator_id 操作人id * goodsList 商品信息 * supplier_id 供货商id * warehouse_id 仓库id * remarks 备注 * ] * ] * @return mixed */ public function MerRetreatActionVerify(&$param) { $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; if (empty($param['merchant_id']) || empty($goodsList) || empty($param['supplier_id']) || empty($param['warehouse_id'])) { return ['status' => 0, 'msg' => '参数错误']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单次操作上限为500种商品']; } foreach ($goodsList as $val) { if (!$val['retreat_price']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if (!$val['retreat_num_act']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } if (!preg_match($reg1, $val['retreat_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //称重 if (!preg_match($reg3, $val['retreat_num_act'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['retreat_num_act'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['retreat_num_act'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } if ($val['retreat_num_act'] > $val['surplus_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量不能大于可退数量']; } //串码信息 if ($val['serial_number_state'] == 1) { if (empty($val['serial_list'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请选择串号']; } if (count($val['serial_list']) != $val['retreat_num_act']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '退货数量有误']; } } } $param['goodsList'] = $goodsList; return callBack(statusCode()['success'], '验证成功'); } /*商户盘点 *@param $user 用户信息 * @param $merchant_id 商户id * @param $warehouse_id 盘点仓库id * @param $remarks 备注 * @param $goodsList 盘点商品 * @param $type 盘盈 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 * @param $stock 采购库是否减少 1减少 其他不减少 *@param $status 盘点状态 0失败 1完成盘点 2进行中(保存到草稿箱) *@param $inventory_order_id 盘点单id */ //商户盘点 public function MerInventorying($merchant_id, $operator_id, $warehouse_id, $remarks, $goodsList) { $stime = time(); $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[0-9][0-9]*$/"; if (!$goodsList || !$warehouse_id || !$merchant_id) { $res['status'] = 0; $res['msg'] = "缺少参数"; $this->ajaxReturn($res); } foreach ($goodsList as $key => &$val) { if (!$val['cost_price']) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "成本价有误"; $this->ajaxReturn($res); } if (!preg_match($reg1, $val['cost_price'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确价格"; $this->ajaxReturn($res); } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确数量"; $this->ajaxReturn($res); } } else { if (!preg_match($reg2, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确数量"; $this->ajaxReturn($res); } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量"; $this->ajaxReturn($res); } } } $data = array(); $data['merchant_id'] = $merchant_id; $data['warehouse_id'] = $warehouse_id; $data['remarks'] = $remarks; $data['add_time'] = $stime; $data['operator_id'] = $operator_id; $InventoryOrder = D('InventoryOrder')->addData($data); if ($InventoryOrder['status'] == 0) { $res['status'] = 0; $res['msg'] = "订单创建失败"; $this->ajaxReturn($res); } $InventoryOrderId = $InventoryOrder['data']; $InventoryOrderNumber = "MP" . orderNumber($InventoryOrderId); //盘点单 $moneyTotal = 0; $numtotal = 0; $warehousing_arr = array(); //入库的商品 $stock_arr = array(); //出库的商品 foreach ($goodsList as $key => &$val) { $content = array(); $content['merchant_id'] = $merchant_id; $content['warehouse_id'] = $warehouse_id; $content['inventory_order_id'] = $InventoryOrderId; $content['inventory_order_number'] = $InventoryOrderNumber; $content['add_time'] = $stime; $content['goods_class_id'] = $val['goods_class_id']; $content['goods_id'] = $val['goods_id']; $content['goods_name'] = $val['goods_name']; $content['sku_name'] = $val['sku_name']; $content['goods_number'] = $val['goods_number']; $content['sku_goods_number'] = $val['sku_goods_number']; $content['goods_code'] = $val['goods_code']; $content['company'] = $val['company']; $content['attribute_state'] = $val['attribute_state']; $content['pricing_method'] = $val['pricing_method']; $content['goods_num'] = $val['goods_num']; $content['cost_price'] = $val['cost_price']; $content['inventory_num'] = $val['inventory_num']; $num = round($val['inventory_num'] - $val['goods_num'], 3); switch ($num) { case $num > 0: $content['type'] = 1; break; case $num < 0: $content['type'] = 2; break; case $num = 0: $content['type'] = 0; break; default: $content['type'] = 0; } $content['num'] = $num; $content['subtotal'] = round($num * $val['cost_price'], 2); $content['remarks'] = $val['remarks']; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } $success = D('InventoryGoods')->addData($content); $moneyTotal += $content['subtotal']; $numtotal += $num; if ($success['status'] == 0) { $res['status'] = 0; $res['msg'] = '盘点失败'; $this->ajaxReturn($res); } if ($num > 0) { //盘盈 $new_arr = array(); $new_arr = $content; $new_arr['id'] = $val['id']; $new_arr['warehouse_price'] = $val['cost_price']; $new_arr['warehouse_num'] = $num; array_push($warehousing_arr, $new_arr); } else if ($num < 0) { //盘亏 $new_arr = array(); $new_arr = $content; $new_arr['id'] = $val['id']; $new_arr['output_num'] = ($val['goods_num'] - $val['inventory_num']); array_push($stock_arr, $new_arr); } } if (!empty($warehousing_arr)) { //盘盈 $type = 3; $stock = 3; $res = $this->MerWarehousing($merchant_id, $operator_id, $supplier_id = 0, $warehouse_id, $remarks, $type, $warehousing_arr, $stock, $InventoryOrderNumber); if ($res['status'] == 0) { $res['status'] = 0; $res['msg'] = '入库单操作失败'; $this->ajaxReturn($res); } } if (!empty($stock_arr)) { //盘亏 $type = 2; $res = $this->MerStockOut($merchant_id, $store_id = 0, $operator_id, $warehouse_id, $remarks, $type, $stock_arr, $InventoryOrderNumber); if ($res['status'] == 0) { $res['status'] = 0; $res['msg'] = '入库单操作失败'; $this->ajaxReturn($res); } } $text['amount'] = $moneyTotal; $text['quantity'] = $numtotal; $text['goods_species'] = count($goodsList); $text['status'] = 1; $text['order_number'] = $InventoryOrderNumber; $success = D('InventoryOrder')->updateData(array('id' => $InventoryOrderId), $text); if ($success['status'] == 0) { $res['status'] = 0; $res['msg'] = '操作失败'; $this->ajaxReturn($res); } $res['status'] = 1; $res['msg'] = '成功'; return $res; } //2019-10-9新接口 public function MerInventorying_V1($parameter) { $merchant_id = $parameter['merchant_id']; $operator_id = $parameter['operator_id']; $remarks = $parameter['remarks']; $goodsList = $parameter['goodsList']; $status = $parameter['status'] ? $parameter['status'] : 1; $inventory_order_id = $parameter['inventory_order_id'] ? $parameter['inventory_order_id'] : null; $stime = time(); $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[0-9][0-9]*$/"; if (!$goodsList || !$merchant_id) { $res['status'] = 0; $res['msg'] = "缺少参数"; return $res; } if (count($goodsList) > 500) { $res['status'] = 0; $res['msg'] = "一次盘点商品上限为500种商品"; return $res; } $WarehouseModel = new SaleWarehouseModel(); $warehouse_id = $WarehouseModel->basisOrderGetFindField([ 'merchant_id' => $merchant_id, 'status' => 1 ], "id"); if (empty($warehouse_id)) { $res['status'] = 0; $res['msg'] = "请创建供给仓"; return $res; } foreach ($goodsList as $val) { if (!$val['cost_price'] || !preg_match($reg1, $val['cost_price'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "成本价有误"; return $res; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确盘点数量"; return $res; } if (!preg_match($reg3, abs($val['goods_num']))) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误"; return $res; } } else { if (!preg_match($reg2, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "请输入正确盘点数量"; return $res; } if (!preg_match($reg2, abs($val['goods_num']))) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误"; return $res; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['inventory_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确盘点数量"; return $res; } if (!preg_match($reg3, abs($val['goods_num']))) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . "商品称重属性改变,库存有误"; return $res; } } } if (empty($inventory_order_id)) { //初始化直接盘点 $data = array( 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'operator_id' => $operator_id, 'add_time' => $stime ); if ($status == 1) { $data['inventory_time'] = $stime; //盘点提交时间 } $InventoryOrder = D('InventoryOrder')->addData($data); if ($InventoryOrder['status'] == 0) { $res['status'] = 0; $res['msg'] = "订单创建失败"; return $res; } $InventoryOrderId = $InventoryOrder['data']; $InventoryOrderNumber = "MP" . orderNumber($InventoryOrderId); //盘点单 } else if (!empty($inventory_order_id)) { //草稿箱的商品盘点 $InventoryOrderNumber = D('InventoryOrder')->getFindField(array('id' => $inventory_order_id), "order_number"); if (empty($InventoryOrderNumber)) { $res = array( 'status' => 0, 'msg' => '未找到该盘点单号' ); return $res; } $InventoryOrderId = $inventory_order_id; } $InventoryClass = new InventoryOperation(); if (C('IS_SET_REDIS')) { $orderStateResult = $InventoryClass->testLock([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'order_id' => $InventoryOrderId ]); if ($orderStateResult['status'] != 1) { $res = array( 'status' => 0, 'msg' => '该订单正在操作中,请稍后重试' ); return $res; } $InventoryClass->addLock([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'order_id' => $InventoryOrderId ]); } $moneyTotal = 0; $numtotal = 0; $warehousing_arr = array(); //入库的商品 $stock_arr = array(); //出库的商品 $inventory_goods_ids = array(); //最终提交的盘点商品 foreach ($goodsList as $key => &$val) { $content = array( 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'inventory_order_id' => $InventoryOrderId, 'inventory_order_number' => $InventoryOrderNumber, 'add_time' => $stime, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'goods_num' => $val['goods_num'], 'cost_price' => $val['cost_price'], 'inventory_num' => $val['inventory_num'], 'remarks' => $val['remarks'] ); $num = round($val['inventory_num'] - $val['goods_num'], 3); if ($num > 0) { $content['type'] = 1; } else if ($num < 0) { $content['type'] = 2; } else { $content['type'] = 0; } $content['num'] = $num; $content['subtotal'] = round($num * $val['cost_price'], 2); if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } if (!empty($inventory_order_id) && !empty($val['inventory_goods_id'])) { array_push($inventory_goods_ids, $val['inventory_goods_id']); $success = D('InventoryGoods')->updateData(array('id' => $val['inventory_goods_id']), $content); } else { $success = D('InventoryGoods')->addData($content); if ($success['status'] == 1) { array_push($inventory_goods_ids, $success['data']); } else { if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'order_id' => $InventoryOrderId, ]); } return $success; } } $moneyTotal += $content['subtotal']; $numtotal += $num; if ($status == 1) { if ($num > 0) { //盘盈 $new_arr = array(); $new_arr = $content; $new_arr['id'] = $val['id']; $new_arr['warehouse_price'] = $val['cost_price']; $new_arr['warehouse_num'] = $num; array_push($warehousing_arr, $new_arr); } else if ($num < 0) { //盘亏 $new_arr = array(); $new_arr = $content; $new_arr['stock_price'] = $val['cost_price']; $new_arr['id'] = $val['id']; $new_arr['output_num'] = ($val['goods_num'] - $val['inventory_num']); array_push($stock_arr, $new_arr); } } } if (!empty($warehousing_arr)) { //盘盈 $parameter = array( 'merchant_id' => $merchant_id, 'operator_id' => $operator_id, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'goodsList' => $warehousing_arr, 'type' => 3, 'stock' => 3, 'order_number' => $InventoryOrderNumber ); $res = $this->MerWarehousing($parameter); if ($res['status'] == 0) { if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'order_id' => $InventoryOrderId, ]); } $res['status'] = 0; $res['msg'] = '入库单操作失败'; return $res; } } if (!empty($stock_arr)) { //盘亏 $parameter = array( 'merchant_id' => $merchant_id, 'operator_id' => $operator_id, 'warehouse_id' => $warehouse_id, 'remarks' => $remarks, 'type' => 2, 'goodsList' => $stock_arr, 'order_number' => $InventoryOrderNumber, ); $res = $this->MerStockOut($parameter); if ($res['status'] == 0) { if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'order_id' => $InventoryOrderId, ]); } $res['status'] = 0; $res['msg'] = '入库单操作失败'; return $res; } } if (!empty($inventory_order_id)) { D('InventoryGoods')->deleteData(array('inventory_order_id' => $inventory_order_id, 'id' => array('not in', $inventory_goods_ids))); } $text = array( 'amount' => $moneyTotal, 'quantity' => $numtotal, 'goods_species' => count($goodsList), 'status' => $status, 'order_number' => $InventoryOrderNumber ); $success = D('InventoryOrder')->updateData(array('id' => $InventoryOrderId), $text); if ($success['status'] == 0) { if (!empty($inventory_order_id)) { $res = array( 'status' => 0, 'msg' => "暂无修改" ); } else { $res = array( 'status' => 0, 'msg' => '操作失败' ); } if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'order_id' => $InventoryOrderId, ]); } return $res; } if (C('IS_SET_REDIS')) { $InventoryClass->eliminate([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'order_id' => $InventoryOrderId, ]); } $res['status'] = 1; $res['msg'] = '成功'; return $res; } /** * 商户入库操作 * @param $param * [ * merchant_id * operator_id 操作人id * supplier_id 供货商id * remarks 备注 * type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收入库 7.门店申请调拨拒收入库 * goodsList 商品信息 * stock 采购库是否减少 1采购仓库减少 其他都不减少 * order_number 订单号实时盘点所需 * ] * @return array */ public function MerWarehousing($param) { $verifyResult = $this->MerWarehousingVerify($param); //参数验证 if ($verifyResult['status'] == 0) { return $verifyResult; } $warehouse_id = $verifyResult['data']; //仓库id $time = $_SERVER['REQUEST_TIME']; $data = [ 'merchant_id' => $param['merchant_id'], 'warehouse_id' => $warehouse_id, 'remarks' => $param['remarks'], 'type' => $param['type'], 'add_time' => $time, 'retreat_time' => $time, 'operator_id' => $param['operator_id'] ]; if (!empty($param['supplier_id'])) { $data['supplier_id'] = $param['supplier_id']; } try { M()->startTrans(); $WarehousingRecordModel = new WarehousingRecordModel(); $warehouseOrder = $WarehousingRecordModel->addData($data); if ($warehouseOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $warehouseOrderId = $warehouseOrder['data']; if (!empty($param['order_number'])) { $warehouseOrderNumber = $param['order_number']; } else { $warehouseOrderNumber = 'MR' . orderNumber($warehouseOrderId); } $warehousing_param = [ 'stock' => $param['stock'] ? $param['stock'] : '', 'warehouseOrderId' => $warehouseOrderId, 'goodsList' => $param['goodsList'], 'merchant_id' => $param['merchant_id'], 'warehouse_id' => $warehouse_id, 'supplier_id' => $param['supplier_id'] ? $param['supplier_id'] : 0, 'warehouseOrderNumber' => $warehouseOrderNumber, 'type' => $param['type'], ]; $warehousing_record = $this->MerchantWarehousingRecord($warehousing_param); //存入入库记录表 if ($warehousing_record['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => $warehousing_record['message']]; } $moneyTotal = $warehousing_record['data']['moneyTotal'] ? $warehousing_record['data']['moneyTotal'] : 0; //总金额 $text = [ 'money_total' => $moneyTotal, 'goods_species' => count($param['goodsList']), 'real_goods_species' => count($param['goodsList']), 'real_money_total' => $moneyTotal, 'status' => 1, 'order_number' => $warehouseOrderNumber ]; $success = $WarehousingRecordModel->updateData(array('id' => $warehouseOrderId), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } M()->commit(); return ['status' => 1, 'msg' => '操作成功']; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 商户入库的信息验证 * @param $param * [ * merchant_id * operator_id 操作人id * supplier_id 供货商id * remarks 备注 * type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收入库 7.门店申请调拨拒收入库 * goodsList 商品信息 * stock 采购库是否减少 1采购仓库减少 其他都不减少 * order_number 订单号实时盘点所需 * ] * @return array */ public function MerWarehousingVerify(&$param) { //销售仓 $WarehouseClass = new Warehouse(); $warehouseResult = $WarehouseClass->getSaleWarehouseId([ 'user_type' => 3, 'merchant_id' => $param['merchant_id'] ]); if ($warehouseResult['status'] != 1) { $warehouseResult['msg'] = $warehouseResult['message']; return $warehouseResult; } if (is_array($param['goodsList'])) { $goodsList = $param['goodsList']; } else { $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); } if (empty($goodsList) || !isset($param['type'])) { return ['status' => 0, 'msg' => '缺少参数']; } $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $val) { if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期']; } if (!$val['warehouse_price']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if (!preg_match($reg1, $val['warehouse_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['warehouse_num'])) { return ['status' => 0, 'msg' => '请输入正确数量']; } } else { if (!preg_match($reg2, $val['warehouse_num'])) { return ['status' => 0, 'msg' => '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['warehouse_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->serialVerify([ 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . $serialResult['message']]; } if ($val['warehouse_num'] != count($val['serial_list'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '入库数量有误']; } } } $param['goodsList'] = $goodsList; return ['status' => 1, 'msg' => '验证成功', 'data' => $warehouseResult['data']]; } /** * 商户入库记录表操作 * @param $parameter * [ * stock 1表示采购入库,需要减去采购库库存 * warehouseOrderId 入库单id * warehouseOrderNumber 入库订单号 * goodsList 入库的商品信息 array * merchant_id 商户id * warehouse_id 仓库id * type 入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收 7门店申请调拨拒收入库 * ] * @return array * [ * status * message * data=>[ * lose 入库存入失败的商品信息 * cost 成本价记录失败的商品信息 * moneyTotal 总入库金额 * ] * ] */ public function MerchantWarehousingRecord($parameter) { try { $PurchaseGoods = new PurchaseGoodsModel(); $WarehousingGoods = new WarehousingGoodsModel(); $SaleWarehouseModel = new SaleWarehouseModel(); $SerialClass = new SerialNumberGoods(); $stock = $parameter['stock'] ? $parameter['stock'] : ''; //1表示采购入库,需要减去采购库库存 $warehouseOrderId = $parameter['warehouseOrderId'] ? $parameter['warehouseOrderId'] : 0; //入库单id $goodsList = $parameter['goodsList']; $merchant_id = $parameter['merchant_id']; //商户id if (empty($parameter['warehouse_id'])) { $warehouse_info = $SaleWarehouseModel->getFind(array('merchant_id' => $merchant_id, 'status' => 1)); //仓库id $warehouse_id = $warehouse_info['id']; } else { $warehouse_id = $parameter['warehouse_id']; //仓库id } $supplier_id = $parameter['supplier_id'] ? $parameter['supplier_id'] : 0; //供货商id $warehouseOrderNumber = $parameter['warehouseOrderNumber'] ? $parameter['warehouseOrderNumber'] : ''; //入库订单号 $type = $parameter['type']; //入库类型 0其他入库 1采购入库 2补货入库 3盘盈入库 4退货入库 5初始化入库 6商户调拨门店拒收 7门店申请调拨拒收入库 $time = $_SERVER['REQUEST_TIME']; $moneyTotal = 0; //总金额 foreach ($goodsList as $key => &$val) { $content = [ 'warehouse_record_id' => $warehouseOrderId, 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'supplier_id' => $supplier_id, 'warehouse_order_number' => $warehouseOrderNumber, 'type' => $type, 'add_time' => $time, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'sku_name' => $val['sku_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'warehouse_price' => $val['warehouse_price'], 'warehouse_num' => $val['warehouse_num'], 'surplus_num' => $val['warehouse_num'], 'subtotal' => round($val['warehouse_price'] * $val['warehouse_num'] * 1, 2), 'remarks' => $val['remarks'] ? $val['remarks'] : '', 'purchase_order_number' => $val['order_number'] ? $val['order_number'] : '', 'purchase_warehouse_id' => $val['warehouse_id'] ? $val['warehouse_id'] : null, 'build_date' => $val['build_date'] ? (is_numeric($val['build_date']) ? $val['build_date'] : strtotime($val['build_date'])) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } $success = $WarehousingGoods->addData($content); if ($success['status'] == 0) { return callBack(statusCode()['error'], '入库记录添加失败'); } //入库串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->warehouseSerial([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'type' => $type, 'add_time' => $time, 'serial_list' => $val['serial_list'], ]); if ($serialResult['status'] != 1) { return callBack(statusCode()['error'], '串号记录添加失败'); } } $moneyTotal += $content['subtotal']; $map = [ 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'goods_id' => $content['goods_id'], ]; if ($content['attribute_state'] == 2) { $map['sku_id'] = $content['sku_id']; } $success = $this->MerGoodsStockOperation($map, $content); if ($success['status'] == 0) { return callBack(statusCode()['error'], '成本价记录失败'); } if ($stock == 1) { //采购入库 $tap = array(); $tap['id'] = $val['id']; $tap['merchant_id'] = $merchant_id; $tap['warehouse_id'] = $val['warehouse_id']; $tap['goods_id'] = $val['goods_id']; if ($content['attribute_state'] == 2) { $tap['sku_id'] = $content['sku_id']; } $PurchaseGoods->updateSetDec($tap, "surplus_num", $content['warehouse_num']); $PurchaseGoods->updateSetInc($tap, "warehousing_num", $content['warehouse_num']); if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->warehousePurchaseSerial([ 'user_type' => 3, 'serial_list' => $val['serial_list'], ]); if ($serialResult['status'] != 1) { return callBack(statusCode()['error'], '采购商品串号信息修改失败'); } } } } return callBack(statusCode()['success'], '入库成功', ['moneyTotal' => $moneyTotal]); } catch (\Exception $e) { return callBack(statusCode()['error'], '入库失败', ['moneyTotal' => 0]); } } /** * 商户出库 * @param $param * [ * operator_id 操作人id * merchant_id * supplier_id 供货商id * store_id * warehouse_id 仓库id * remarks 备注 * type 0其他出库 1调拨出库 2盘亏出库 3门店申请调拨出库 4退货出库 * goodsList 商品信息 * order_number 订单号 * ] * @return mixed */ public function MerStockOut($param) { $verifyResult = $this->MerStockOutVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } $warehouse_id = $verifyResult['data']['warehouse_id']; //仓库id $store_arr = $verifyResult['data']['store_arr']; //门店 $merchant_id = $param['merchant_id']; $supplier_id = $param['supplier_id']; $time = $_SERVER['REQUEST_TIME']; $goodsList = $param['goodsList']; $type = $param['type']; try { M()->startTrans(); $StockOutOrderModel = new StockOutOrderModel(); $StockOutGoodsModel = new StockOutGoodsModel(); $SSaleWarehouseModel = new SSaleWarehouseModel(); $SWarehousingRecordModel = new SWarehousingRecordModel(); $SaleMGoodsModel = new SaleMGoodsModel(); $SkuGoodsModel = new SkuMGoodsModel(); $GoodsModel = new RetailMgoodsModel(); $CostPriceRecordModel = new CostPriceRecordModel(); $RetreatReceivablesModel = new RetreatReceivablesModel(); $SerialClass = new SerialNumberGoods(); foreach ($store_arr as $sval) { $data = [ 'merchant_id' => $merchant_id, 'store_id' => $sval, 'warehouse_id' => $warehouse_id, 'remarks' => $param['remarks'], 'type' => $type, 'add_time' => $time, 'operator_id' => $param['operator_id'] ]; if ($type == 4) { $data['supplier_id'] = $supplier_id; } $StockOutOrder = $StockOutOrderModel->addData($data); if ($StockOutOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $StockOutOrderId = $StockOutOrder['data']; if (!empty($param['order_number'])) { $StockOutOrderNumber = $param['order_number']; } else { switch ($type) { case 0: $order_name = "MQ"; break; case 1: $order_name = "MD"; break; case 2: $order_name = "MP"; break; case 4: $order_name = "MG"; break; } $StockOutOrderNumber = $order_name . orderNumber($StockOutOrderId); } if ($type == 1 || $type == 3) { //调拨出库门店入库单 $store_warehouse = [ 'merchant_id' => $merchant_id, 'store_id' => $sval, 'remarks' => $param['remarks'] ]; $store_warehouse['warehouse_id'] = $SSaleWarehouseModel->getFindField(array('merchant_id' => $merchant_id, 'store_id' => $sval, 'status' => 1), "id"); if ($type == 1) { $store_warehouse['type'] = 4; } else if ($type == 3) { $store_warehouse['type'] = 6; } $store_warehouse['allocation_time'] = $time; $store_warehouse['stock_out_id'] = $StockOutOrderId; $store_warehouse_info = $SWarehousingRecordModel->addData($store_warehouse); if ($store_warehouse_info['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '门店入库订单创建失败']; } $warehouse_record_id = $store_warehouse_info['data']; } $moneyTotal = 0; //出库总金额 $total_cost_price = 0; //总成本价; foreach ($goodsList as $val) { $content = array( 'merchant_id' => $merchant_id, 'store_id' => $sval, 'warehouse_id' => $warehouse_id, 'stock_out_id' => $StockOutOrderId, 'stock_order_number' => $StockOutOrderNumber, 'type' => $type, 'add_time' => $time, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'stock_price' => $val['stock_price'], 'cost_price' => $val['cost_price'], 'stock_num' => $val['output_num'], 'subtotal' => round($val['stock_price'] * $val['output_num'] * 1, 2), 'remarks' => $val['remarks'], 'build_date' => $val['build_date'] ? strtotime($val['build_date']) : null, 'quality_guarantee_period' => $val['quality_guarantee_period'] ? $val['quality_guarantee_period'] : '', 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ); if ($type == 1 || $type == 3) { $content['warehouse_record_id'] = $warehouse_record_id; } if ($type == 4) { $content['supplier_id'] = $supplier_id; } if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } $success = $StockOutGoodsModel->addData($content); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '出库失败']; } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->stockSerial([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'outside_id' => $success['data'], 'type' => $type, 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'serial_list' => $val['serial_list'] ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => '串号保存失败']; } } $moneyTotal += $content['subtotal']; $total_cost_price += round($content['cost_price'] * $content['stock_num'], 2); $where = [ 'merchant_id' => $merchant_id, 'goods_id' => $val['goods_id'], 'status' => ['in', '0,1'] ]; if ($val['attribute_state'] == 2) { $where['sku_id'] = $val['sku_id']; } $goods_total_num = $SaleMGoodsModel->getFindField($where, "goods_num"); $SaleMGoodsModel->updateSetDec($where, "goods_num", $val['output_num']); if ($goods_total_num > 0) { $ware_arr = [ 'merchant_id' => $merchant_id, 'goods_id' => $val['goods_id'], 'surplus_num' => ['gt', 0], ]; if ($val['attribute_state'] == 2) { $ware_arr['sku_id'] = $val['sku_id']; } $this->MerWarehouseReduce($ware_arr, $val['output_num']); //串号信息操作 if ($val['serial_number_state'] == 1) { $serial_id_arr = array_column($val['serial_list'], 'id'); $serialResult = $SerialClass->warehouseSerialDec([ 'user_type' => 3, 'serial_id_arr' => $serial_id_arr, 'type' => 1, 'merchant_id' => $merchant_id, ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => $serialResult['message']]; } } //退货出库完重新计算成本价 if ($type == 4) { $cost_map = [ 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'goods_id' => $content['goods_id'] ]; if ($content['attribute_state'] == 2) { $cost_map['sku_id'] = $content['sku_id']; } $success = $this->MerCostPrice($cost_map); if ($success['status'] == 1) { $cost_price = round($success['data'], 2); if ($cost_price > 0) { $SaleMGoodsModel->updateData($cost_map, array('cost_price' => $cost_price)); if (!empty($cost_map['sku_id'])) { $SkuGoodsModel->updateOrder([ 'id' => $cost_map['sku_id'], 'mgoods_id' => $cost_map['goods_id'] ], [ 'purch_price' => $cost_price ]); } else { $GoodsModel->updateOrder(array('id' => $cost_map['goods_id']), array('purch_price' => $cost_price)); } $cost_content = [ 'merchant_id' => $merchant_id, 'cost_price' => $cost_price, 'goods_id' => $content['goods_id'], 'sku_id' => $content['sku_id'] ? $content['sku_id'] : 0, 'purchase_price' => $content['stock_price'], 'goods_class_id' => $content['goods_class_id'], 'attribute_state' => $content['attribute_state'], 'pricing_method' => $content['pricing_method'], 'add_time' => $content['add_time'], 'type' => 2 ]; $CostPriceRecordModel->addData($cost_content); } } } } } $text = array( 'money_total' => $moneyTotal, 'total_cost_price' => $total_cost_price, 'goods_species' => count($goodsList), 'status' => 1, 'order_number' => $StockOutOrderNumber ); if ($type == 1 || $type == 3) { $text['warehouse_record_id'] = $warehouse_record_id; } $success = $StockOutOrderModel->updateData(array('id' => $StockOutOrderId), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } switch ($type) { case 1: case 3: unset($text['status']); $success = $SWarehousingRecordModel->updateData(array('id' => $warehouse_record_id), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } break; case 4: //生成退货资金 $capital_arr = [ 'merchant_id' => $merchant_id, 'supplier_id' => $supplier_id, 'retreat_order_id' => $StockOutOrderId, 'retreat_order_number' => $StockOutOrderNumber, 'operator_id' => $param['operator_id'], 'retreat_time' => $time, 'collect_money' => $moneyTotal, 'type' => 2 //2已入库的退货 ]; $success = $RetreatReceivablesModel->addData($capital_arr); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } break; } } M()->commit(); if ($type == 3) { $res['stockOrderId'] = $StockOutOrderId; $res['warehouseOrderId'] = $warehouse_record_id; $res['goods_species'] = count($goodsList); $res['money_total'] = $moneyTotal; } $res['status'] = 1; $res['msg'] = '成功'; return $res; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 商户出库参数验证 * @param $param * [ * operator_id 操作人id * merchant_id * supplier_id 供货商id * store_id * warehouse_id 仓库id * remarks 备注 * type 0其他出库 1调拨出库 2盘亏出库 3门店申请调拨出库 4退货出库 * goodsList 商品信息 * order_number 订单号 * ] * @return mixed */ public function MerStockOutVerify(&$param) { if (!empty($param['warehouse_id'])) { $warehouse_id = $param['warehouse_id']; } else { $SaleWarehouseModel = new SaleWarehouseModel(); $warehouse_id = $SaleWarehouseModel->getFindField(['merchant_id' => $param['merchant_id'], 'status' => 1], "id"); if (empty($warehouse_id)) { return ['status' => 0, 'msg' => '请先创建供给仓']; } } if (is_array($param['goodsList'])) { $goodsList = $param['goodsList']; } else { $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); } if (empty($goodsList) || !isset($param['type']) || empty($param['merchant_id'])) { return ['status' => 0, 'msg' => '缺少必要参数']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单此操作上限为500种商品']; } if ($param['type'] == 1 && (empty($param['store_id']) && $param['store_id'] != 0)) { return ['status' => 0, 'msg' => '请选择门店']; } if ($param['type'] == 4 && empty($param['supplier_id'])) { return ['status' => 0, 'msg' => '请选择供货商']; } $store_arr = []; if ($param['type'] == 1 || $param['type'] == 3) { //所有门店 if ($param['store_id'] == 0) { $where = [ 'merchantid' => $param['merchant_id'], 'state' => 0 ]; $StoreModel = new RetailStoreModel(); $store_arr = $StoreModel->getFindField($where, "id", true); } else { if (empty($param['store_id'])) { return ['status' => 0, 'msg' => '请选择调拨的门店']; } array_push($store_arr, $param['store_id']); } $SSaleWarehouseModel = new SSaleWarehouseModel(); foreach ($store_arr as $val) { $success = $SSaleWarehouseModel->getFindField(array('merchant_id' => $param['merchant_id'], 'store_id' => $val, 'status' => 1), "id"); if (!$success) { return ['status' => 0, 'msg' => '门店暂无供给仓']; } } } else { $store_arr = [0]; } $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; foreach ($goodsList as $val) { if (!empty($val['quality_guarantee_period']) && !preg_match($reg3, $val['quality_guarantee_period'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确保质期']; } if (empty($val['stock_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if (!preg_match($reg1, $val['stock_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1 && $val['pricing_method'] == 2) { if (!preg_match($reg2, $val['output_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg3, $val['output_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } if ($val['output_num'] * 1 > $val['goods_num'] * 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '出库数量不能大于库存数量']; } if ($param['type'] == 1) { if ($param['store_id'] == 0) { if ($val['output_num'] * count($store_arr) * 1 > $val['goods_num'] * 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '出库数量不能大于库存数量']; } } } //串号信息 if ($val['serial_number_state'] == 1) { if (empty($val['serial_list']) || count($val['serial_list']) != $val['output_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '串号信息数量不足']; } if (count($store_arr) > 1) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '串号商品禁止多门店同时调拨']; } } } $param['goodsList'] = $goodsList; return callBack(statusCode()['success'], '验证成功', [ 'warehouse_id' => $warehouse_id, 'store_arr' => $store_arr ]); } /** * 商户商品库存增加成本价重置 * */ public function MerGoodsStockOperation($where, $data) { $SaleMGoodsModel = new SaleMGoodsModel(); $info = $SaleMGoodsModel->getFind($where); if (!empty($info)) { $SaleMGoodsModel->updateSetInc($where, "goods_num", $data['warehouse_num']); if ($info['cost_price'] != $data['warehouse_price']) {//入库价与成本价不一样 $success = $this->MerCostPrice($where); if ($success['status'] == 1) { $cost_price = $success['data']; $SaleMGoodsModel->updateData($where, array('cost_price' => $cost_price)); if (!empty($where['sku_id'])) { $SkuGoodsModel = new SkuMGoodsModel(); $SkuGoodsModel->updateOrder(array('id' => $where['sku_id'], 'mgoods_id' => $where['goods_id']), array('purch_price' => $cost_price)); } else { $RetailGoodsModel = new RetailMgoodsModel(); $RetailGoodsModel->updateOrder(array('id' => $where['goods_id']), array('purch_price' => $cost_price)); } } else { $res['status'] = 0; $res['msg'] = '入库出错'; } } else { $cost_price = $data['warehouse_price']; } if ($cost_price) { $cost_record = array( 'merchant_id' => $where['merchant_id'], 'cost_price' => $cost_price, 'goods_id' => $where['goods_id'], 'purchase_price' => $data['warehouse_price'], 'goods_class_id' => $data['goods_class_id'], 'attribute_state' => $data['attribute_state'], 'pricing_method' => $data['pricing_method'], 'add_time' => $data['add_time'] ); if ($data['attribute_state'] == 2) { $cost_record['sku_id'] = $where['sku_id']; } $CostPriceRecordModel = new CostPriceRecordModel(); $success = $CostPriceRecordModel->addData($cost_record); if ($success['status'] == 1) { $res['status'] = 1; $res['msg'] = '成功'; } else { $res['status'] = 0; $res['msg'] = '成本价记录失败'; } } } else { $res['status'] = 0; $res['msg'] = '未找到该商品'; } return $res; } /*商户成本价计算 * $priceTotal 当前总成本价 * $numTotal 当前总库存 */ public function MerCostPrice($where) { $where['surplus_num'] = array('gt', 0); $fields = "surplus_num,warehouse_price"; $order = "add_time asc"; $WarehousingGoodsModel = new WarehousingGoodsModel(); $list = $WarehousingGoodsModel->getSelect($where, $page = '', $limit = '', $fields, $order); if (!empty($list)) { $priceTotal = 0; $numTotal = 0; foreach ($list as $val) { $priceTotal += $val['surplus_num'] * $val['warehouse_price']; $numTotal += $val['surplus_num']; } $cost_price = round(($priceTotal / $numTotal), 2); $res['status'] = 1; $res['data'] = $cost_price; } else { $res['status'] = 0; $res['msg'] = '该商品已售完'; } return $res; } /** * 商户商品出库明细库存减少 * @param $where 入库记录条件 * @param $total_num 总数 */ public function MerWarehouseReduce($where, $total_num) { $ware_goods = D('WarehousingGoods')->getSelect($where, '', '', "id,surplus_num", "id asc"); if ($ware_goods) { $stock_arr = array(); foreach ($ware_goods as $v) { if ($v['surplus_num'] >= $total_num) { $ware_push = array( 'id' => $v['id'], 'num' => $total_num ); array_push($stock_arr, $ware_push); break; } else { $ware_push = array( 'id' => $v['id'], 'num' => $v['surplus_num'] ); array_push($stock_arr, $ware_push); $total_num = round($total_num - $v['surplus_num'], 3); } } if (!empty($stock_arr)) { foreach ($stock_arr as $tval) { D('WarehousingGoods')->updateSetDec(array('id' => $tval['id']), "surplus_num", $tval['num']); } } } } /*商户的门店间调拨审核操作 *@param $id 出库单id *@param $type 门店调拨出库商户审核 0未审核 1审核通过 2审核失败 */ public function MerExamine($parameter) { $id = $parameter['id']; $type = $parameter['type']; if (!$id || !$type) { return ['status' => 0, 'msg' => '参数缺失']; } $data['examine_status'] = $type; try { $SStockOutOrderModel = new SStockOutOrderModel(); $success = $SStockOutOrderModel->updateData(array('id' => $id), $data); if ($success['status'] == 0) { return ['status' => 0, 'msg' => '操作失败']; } $SWarehousingRecordModel = new SWarehousingRecordModel(); $success = $SWarehousingRecordModel->updateData(array('stock_out_id' => $id, 'type' => 5), $data); if ($success['status'] == 0) { return ['status' => 0, 'msg' => '操作失败']; } $SStockOutGoodsModel = new SStockOutGoodsModel(); $stockList = $SStockOutGoodsModel->getSelect(array('stock_out_id' => $id), '', '', "id,goods_id,sku_id,attribute_state,stock_num,serial_number_state"); switch ($type) { case 1: if ($stockList) { foreach ($stockList as $val) { $where = [ 'goods_id' => $val['goods_id'], 'surplus_num' => array('gt', 0) ]; if ($val['attribute_state'] == 2) { $where['sku_id'] = $val['sku_id']; } $this->WarehouseReduce($where, $val['stock_num']); } } break; case 2: if (!empty($stockList)) { $SStockOutGoodsModel->updateData(array('stock_out_id' => $id), array('examine_status' => 2)); $SSaleMGoodsModel = new SSaleMGoodsModel(); $SStockSerialModel = new SStockGoodsSerialModel(); $SerialClass = new SerialNumberGoods(); foreach ($stockList as $val) { $where = [ 'goods_id' => $val['goods_id'] ]; if ($val['attribute_state'] == 2) { $where['sku_id'] = $val['sku_id']; } $SSaleMGoodsModel->updateSetInc($where, "goods_num", $val['stock_num']); //串号信息 if ($val['serial_number_state'] == 1) { $where['outside_id'] = $val['id']; $where['num'] = ['gt', 0]; $main_serial_number_arr = $SStockSerialModel->getFindField($where, 'main_serial_number', true); if (!empty($main_serial_number_arr)) { $SerialClass->recoverySerialInc(['user_type' => 4, 'main_serial_number_arr' => $main_serial_number_arr]); } } } } break; } $res['status'] = 1; $res['msg'] = '操作成功'; return $res; } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } //商户供货商信息 public function MerSupplierInfo($supplier_id) { $supplierInfo = D("Supplier")->getFieldInfo(array("id" => $supplier_id), "advance_money,bank_card,bank_name"); $res = array( 'status' => 1, 'msg' => "查询成功", 'advanceMoney' => $supplierInfo['advance_money'], 'bank_card' => $supplierInfo['bank_card'], 'bank_name' => $supplierInfo['bank_name'], ); return $res; } /*商户付款操作 *@param $payable_id 应付款id *@param $pay_type 付款方式 1预付款方式 2微信3支付宝 4线下 5银行卡 * @param $advance_money 应付款 * @param $pay_money 付款金额 * @param $remarks 备注 * @param $add_time 付款时间 * @param $bank_card 银行卡号 * @param $bank_name 银行id * @param $purchase_order_number 采购订单号 * @param supplier_id 供货商id */ public function MerPayment($data, $merchant_id, $operator_id) { $CapitalModel = D("PurchaseCapital"); $PayableModel = D("PurchasePayable"); $SupplierModel = D("Supplier"); $payable_id = $data['payable_id']; $pay_type = $data['pay_type']; $advance_money = $data['advance_money']; $pay_money = $data['pay_money']; $remarks = $data['remarks']; $pay_time = $data['add_time']; $bank_card = $data['bank_card']; $bank_name = $data['bank_name']; $purchase_order_number = $data['purchase_order_number']; $supplier_id = $data['supplier_id']; if (!$pay_type || !$pay_money || !$pay_time || !$purchase_order_number || !$supplier_id || !$payable_id) { $res = array( 'status' => 0, 'msg' => '参数缺失' ); return $res; } if ($pay_type == 1 && (!$advance_money || $advance_money < $pay_money)) { $res = array( 'status' => 0, 'msg' => '预付款金额有误' ); return $res; } if ($pay_type == 5 && (!$bank_card || !$bank_name)) { $res = array( 'status' => 0, 'msg' => '银行卡信息或开户银行有误' ); return $res; } $payableInfo = $PayableModel->getFind(array($PayableModel::ID => $payable_id)); if (!$payableInfo) { $res = array( 'status' => 0, 'msg' => '未找到改采购应付款订单', ); return $res; } $stay_money = round($payableInfo['payable_money'] - $payableInfo['paid_money'], 2); //待付金额 if ($stay_money <= 0) { $res = array( 'status' => 0, 'msg' => '该采购单应付金额已全部结清,请勿重复操作', ); return $res; } if ($pay_money > $stay_money) { $res = array( 'status' => 0, 'msg' => '付款金额不能大于待付金额', ); return $res; } $content = array( $CapitalModel::MERCHANT_ID => $merchant_id, $CapitalModel::SUPPLIER_ID => $supplier_id, $CapitalModel::OPERATOR_ID => $operator_id, $CapitalModel::PURCHASE_ORDER_NUMBER => $purchase_order_number, $CapitalModel::PAY_TYPE => $pay_type, $CapitalModel::PAY_MONEY => $pay_money, $CapitalModel::REMARKS => $remarks, $CapitalModel::PAY_TIME => strtotime($pay_time), $CapitalModel::ADD_TIME => time() ); if ($pay_type == 5) { $content[$CapitalModel::BANK_CARD] = $bank_card; $content['bank_name'] = $bank_name; } $res = $CapitalModel->addData($content); if ($res['status'] == 1) { if ($pay_type == 1) { $SupplierModel->updateSetDec(array('id' => $supplier_id), "advance_money", $pay_money); } $PayableModel->updateSetInc(array($PayableModel::ID => $payable_id), $PayableModel::PAID_MONEY, $pay_money); if (round($pay_money - $stay_money, 2) == 0) { $able[$PayableModel::PAY_STATUS] = 3; } else { $able[$PayableModel::PAY_STATUS] = 2; } $PayableModel->updateData(array($PayableModel::ID => $payable_id), $able); $add_id = $res['data']; $order_number = 'MY' . orderNumber($add_id); $res = $CapitalModel->updateData(array($CapitalModel::ID => $add_id), array($CapitalModel::ORDER_NUMBER => $order_number)); } return $res; } //商户采购资金流水 public function MerCapitalList($where, $page, $limit, $fields) { $CapitalModel = D("PurchaseCapital"); $CapitalList = $CapitalModel->getSelect($where, $page, $limit, $fields); if ($CapitalList) { $count = $CapitalModel->getCount($where); foreach ($CapitalList as $key => &$val) { $val['index'] = $key + 1; $val['pay_money'] = round($val['pay_money'], 2); $val['pay_time'] = date('Y-m-d H:i:s', $val['pay_time']); $val['add_time'] = date('Y-m-d H:i:s', $val['add_time']); $val['operator_name'] = $this->OperatorName($val['operator_id']); $val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name"); switch ($val[$CapitalModel::PAY_TYPE]) { case 1: $val['pay_name'] = "预付款方式"; break; case 2: $val['pay_name'] = "微信"; break; case 3: $val['pay_name'] = "支付宝"; break; case 4: $val['pay_name'] = "线下"; break; case 5: $val['pay_name'] = "银行卡"; break; } } } $CapitalList = $CapitalList ? $CapitalList : array(); $count = $count ? $count : 0; $res = array( 'status' => 1, 'msg' => "查询成功", 'data' => $CapitalList, 'count' => $count ); return $res; } //商户预付款列表 public function MerAdvanceList($where, $page, $limit, $fields) { $advanceList = D("Supplier")->getSelect($where, $page, $limit, $fields); if ($advanceList) { $count = D("Supplier")->getCount($where); foreach ($advanceList as $key => &$val) { $val['index'] = $key + 1; $val['advance_money'] = round($val['advance_money'], 2); } } $advanceList = $advanceList ? $advanceList : array(); $count = $count ? $count : 0; $res = array( 'status' => 1, 'data' => $advanceList, 'count' => $count, 'msg' => "查询成功" ); return $res; } //商户预付款 public function MerAdvanceOperation($data, $merchant_id, $operator_id) { $reg = '/^[0-9]+(.[0-9]{1,2})?$/'; $SupplierModel = D("Supplier"); $AdvanceModel = D("AdvancePayment"); if (!$data['supplier_id']) { $res = array( 'status' => 0, 'msg' => "参数缺失" ); return $res; } if (empty($data['type'])) { $res = array( 'status' => 0, 'msg' => "请选择预付款类型" ); return $res; } if (empty($data['money']) || !preg_match($reg, $data['money'])) { $res = array( 'status' => 0, 'msg' => "请输入正确金额" ); return $res; } if ($data['money'] > 100000) { $res = array( 'status' => 0, 'msg' => "金额不能超过10万元" ); return $res; } $type = $data['type']; $money = $data['money']; $supplier_id = $data['supplier_id']; $where['id'] = $supplier_id; $advanceMoney = $SupplierModel->getFindField($where, "advance_money"); switch ($type) { case 1: $success = $SupplierModel->updateSetInc($where, "advance_money", $money); break; case 2: if (round($advanceMoney - $money, 2) < 0) { $res = array( 'status' => 0, 'msg' => "减少金额不能大于总余额" ); return $res; } $success = $SupplierModel->updateSetDec($where, "advance_money", $money); break; } if ($success) { $content = array( $AdvanceModel::MERCHANT_ID => $merchant_id, $AdvanceModel::SUPPLIER_ID => $supplier_id, $AdvanceModel::OPERATOR_ID => $operator_id, $AdvanceModel::TYPE => $type, $AdvanceModel::MONEY => $money, $AdvanceModel::ADD_TIME => time() ); $res = $AdvanceModel->addData($content); if ($res['status'] == 0) { $res['msg'] = '暂无修改'; } } else { $res = array( 'status' => 0, 'msg' => '暂无改变' ); } return $res; } //商户预付款记录 public function MerRecord($where, $page, $limit, $fields) { $AdvanceModel = D("AdvancePayment"); $recordList = $AdvanceModel->getSelect($where, $page, $limit, $fields); if ($recordList) { $count = $AdvanceModel->getCount($where); foreach ($recordList as $key => &$val) { $val['index'] = $key + 1; $val['add_time'] = date("Y-m-d H:i:s", $val['add_time']); $val['money'] = round($val['money'], 2); if ($val['type'] == 1) { $val['type_name'] = "增加"; } else if ($val['type'] == 2) { $val['type_name'] = "减少"; } $val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name"); $val['operator_name'] = $this->OperatorName($val['operator_id']); } } $count = $count ? $count : 0; $recordList = $recordList ? $recordList : array(); $res = array( 'status' => 1, 'msg' => "查询成功", 'data' => $recordList, 'count' => $count ); return $res; } //商户退货应收款列表 public function MerReceivableList($where, $page, $limit, $fields) { $RetreatReceivablesModel = D("RetreatReceivables"); $RetreatList = $RetreatReceivablesModel->getSelect($where, $page, $limit, $fields); $TotalRetreatList = $RetreatReceivablesModel->getSelect($where, $page = '', $limit = '', "*"); if ($RetreatList) { $count = $RetreatReceivablesModel->getCount($where); foreach ($RetreatList as $key => &$val) { $val['index'] = $key + 1; $val[$RetreatReceivablesModel::RETREAT_TIME] = date("Y-m-d H:i:s", $val[$RetreatReceivablesModel::RETREAT_TIME]); $val[$RetreatReceivablesModel::COLLECT_MONEY] = round($val[$RetreatReceivablesModel::COLLECT_MONEY], 2); $val[$RetreatReceivablesModel::RECEIVED_MONEY] = round($val[$RetreatReceivablesModel::RECEIVED_MONEY], 2); $val['stay_money'] = round($val[$RetreatReceivablesModel::COLLECT_MONEY] - $val[$RetreatReceivablesModel::RECEIVED_MONEY], 2); $val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val[$RetreatReceivablesModel::SUPPLIER_ID]), "supplier_name"); $val['operator'] = $this->OperatorName($val[$RetreatReceivablesModel::OPERATOR_ID]); switch ($val[$RetreatReceivablesModel::PAY_STATUS]) { case 1: $val['pay_name'] = "待收款"; break; case 2: $val['pay_name'] = "部分收款"; break; case 3: $val['pay_name'] = "已收款"; break; } } unset($val); } $collect_money = 0; //应收 $received_money = 0; //已收 $stay_money = 0; //待收 if ($TotalRetreatList) { foreach ($TotalRetreatList as $val) { $collect_money += $val['collect_money']; $received_money += $val['received_money']; } } $stay_money = round($collect_money - $received_money, 2); $RetreatList = $RetreatList ? $RetreatList : array(); $count = $count ? $count : 0; $TotalList = array( array( 'collect_money' => $collect_money, 'received_money' => $received_money, 'stay_money' => $stay_money ) ); $res = array( 'status' => 1, 'msg' => '查询成功', 'data' => $RetreatList, 'TotalList' => $TotalList, 'count' => $count, ); return $res; } /*商户退货收款 * @param receivables_id 应收款id * @param $pay_type 付款方式 2微信3支付宝 4线下 5银行卡 * @param $collect_money 收款金额 * @param remarks 备注 * @param add_time 收款时间 * @param bank_card 银行卡号 * @param bank_name 银行id * @param retreat_order_number 采购退货单号 * @param supplier_id 供货商id */ public function MerCollect($data, $merchant_id, $operator_id) { $CapitalModel = D("RetreatCapital"); $RetreatReceivablesModel = D("RetreatReceivables"); $receivables_id = $data['receivables_id']; $pay_type = $data['pay_type']; $collect_money = $data['collect_money']; $remarks = $data['remarks']; $collect_time = $data['add_time']; $bank_card = $data['bank_card']; $bank_name = $data['bank_name']; $retreat_order_number = $data['retreat_order_number']; $supplier_id = $data['supplier_id']; if (!$pay_type || !$collect_money || !$collect_time || !$retreat_order_number || !$supplier_id || !$receivables_id) { $res = array( 'status' => 0, 'msg' => '参数缺失' ); return $res; } if ($pay_type == 5 && (!$bank_card || !$bank_name)) { $res = array( 'status' => 0, 'msg' => '银行卡信息或开户银行有误' ); return $res; } $receivableInfo = $RetreatReceivablesModel->getFind(array($RetreatReceivablesModel::ID => $receivables_id)); if (!$receivableInfo) { $res = array( 'status' => 0, 'msg' => '未找到改退货收款订单', ); return $res; } $stay_money = round($receivableInfo['collect_money'] - $receivableInfo['received_money'], 2); //待收金额 if ($stay_money <= 0) { $res = array( 'status' => 0, 'msg' => '该退货单应付金额已全部结清,请勿重复操作', ); return $res; } if ($collect_money > $stay_money) { $res = array( 'status' => 0, 'msg' => '收款金额不能大于待收金额', ); return $res; } $content = array( $CapitalModel::MERCHANT_ID => $merchant_id, $CapitalModel::SUPPLIER_ID => $supplier_id, $CapitalModel::OPERATOR_ID => $operator_id, $CapitalModel::RETREAT_ORDER_NUMBER => $retreat_order_number, $CapitalModel::PAY_TYPE => $pay_type, $CapitalModel::COLLECT_MONEY => $collect_money, $CapitalModel::REMARKS => $remarks, $CapitalModel::COLLECT_TIME => strtotime($collect_time), $CapitalModel::ADD_TIME => time() ); if ($pay_type == 5) { $content[$CapitalModel::BANK_CARD] = $bank_card; $content['bank_name'] = $bank_name; } $res = $CapitalModel->addData($content); if ($res['status'] == 1) { $RetreatReceivablesModel->updateSetInc(array($RetreatReceivablesModel::ID => $receivables_id), $RetreatReceivablesModel::RECEIVED_MONEY, $collect_money); if (round($collect_money - $stay_money, 2) == 0) { $able[$RetreatReceivablesModel::PAY_STATUS] = 3; } else { $able[$RetreatReceivablesModel::PAY_STATUS] = 2; } $RetreatReceivablesModel->updateData(array($RetreatReceivablesModel::ID => $receivables_id), $able); $add_id = $res['data']; $order_number = "MS" . orderNumber($add_id); $res = $CapitalModel->updateData(array($CapitalModel::ID => $add_id), array($CapitalModel::ORDER_NUMBER => $order_number)); } return $res; } public function MerRetreatCapitalList($where, $page, $limit, $fields) { $RetreatCapitalModel = D("RetreatCapital"); $CapitalList = $RetreatCapitalModel->getSelect($where, $page, $limit, $fields); if ($CapitalList) { $count = $RetreatCapitalModel->getCount($where); foreach ($CapitalList as $key => &$val) { $val['index'] = $key + 1; $val['collect_money'] = round($val['collect_money'], 2); $val['collect_time'] = date('Y-m-d H:i:s', $val['collect_time']); $val['add_time'] = date('Y-m-d H:i:s', $val['add_time']); $val['operator_name'] = $this->OperatorName($val['operator_id']); $val['supplier_name'] = D("Supplier")->getFindField(array('id' => $val['supplier_id']), "supplier_name"); switch ($val[$RetreatCapitalModel::PAY_TYPE]) { case 2: $val['pay_name'] = "微信"; break; case 3: $val['pay_name'] = "支付宝"; break; case 4: $val['pay_name'] = "线下"; break; case 5: $val['pay_name'] = "银行卡"; break; } } } $CapitalList = $CapitalList ? $CapitalList : array(); $count = $count ? $count : 0; $res = array( 'status' => 1, 'msg' => "查询成功", 'data' => $CapitalList, 'count' => $count ); return $res; } /** * 商户报损提交操作 * @param $param * [ * merchant_id * operator_id * remarks 备注 * goodsList 商品信息 * ] * @return mixed */ public function MerReportSub($param) { $verifyResult = $this->MerReportSubVerify($param); //参数验证 if ($verifyResult['status'] != 1) { return $verifyResult; } $merchant_id = $param['merchant_id']; $goodsList = $param['goodsList']; $warehouse_id = $verifyResult['data']; //仓库id $time = $_SERVER['REQUEST_TIME']; $data = [ 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'remarks' => $param['remarks'], 'add_time' => $time, 'operator_id' => $param['operator_id'] ]; try { M()->startTrans(); $LossReportOrderModel = new LossReportOrderModel(); $LossOrder = $LossReportOrderModel->addData($data); if ($LossOrder['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '订单创建失败']; } $LossOrderId = $LossOrder['data']; $LossOrderNumber = "MB" . orderNumber($LossOrderId); $moneyTotal = 0; $LossReportGoods = new LossReportGoodsModel(); $SaleMGoodsModel = new SaleMGoodsModel(); $SerialClass = new SerialNumberGoods(); foreach ($goodsList as $key => &$val) { $content = [ 'merchant_id' => $merchant_id, 'warehouse_id' => $warehouse_id, 'loss_order_id' => $LossOrderId, 'loss_order_number' => $LossOrderNumber, 'add_time' => $time, 'goods_class_id' => $val['goods_class_id'], 'goods_id' => $val['goods_id'], 'goods_name' => $val['goods_name'], 'sku_name' => $val['sku_name'], 'goods_number' => $val['goods_number'], 'sku_goods_number' => $val['sku_goods_number'], 'goods_code' => $val['goods_code'], 'company' => $val['company'], 'attribute_state' => $val['attribute_state'], 'pricing_method' => $val['pricing_method'], 'loss_price' => $val['cost_price'], 'loss_num' => $val['loss_num'], 'subtotal' => round($val['cost_price'] * $val['loss_num'] * 1, 2), 'remarks' => $val['remarks'], 'serial_number_state' => $val['serial_number_state'] ? $val['serial_number_state'] : 0 ]; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; $content['sku_id_list'] = $val['sku_id_list']; } $success = $LossReportGoods->addData($content); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '报损失败']; } //串号信息 if ($val['serial_number_state'] == 1) { $serialResult = $SerialClass->lossSerial([ 'user_type' => 3, 'merchant_id' => $merchant_id, 'outside_id' => $success['data'], 'goods_id' => $val['goods_id'], 'sku_id' => $val['sku_id'], 'add_time' => $time, 'serial_list' => $val['serial_list'], ]); if ($serialResult['status'] != 1) { M()->rollback(); return ['status' => 0, 'msg' => $serialResult['message']]; } } $where = [ 'merchant_id' => $merchant_id, 'goods_id' => $val['goods_id'], ]; if ($val['attribute_state'] == 2) { $where['sku_id'] = $val['sku_id']; } $goods_total_num = $SaleMGoodsModel->getFindField($where, "goods_num"); $SaleMGoodsModel->updateSetDec($where, "goods_num", $val['loss_num']); //商户库存减少 if ($goods_total_num > 0) { $ware_arr = [ 'merchant_id' => $merchant_id, 'goods_id' => $val['goods_id'], 'surplus_num' => ['gt', 0], ]; if ($val['attribute_state'] == 2) { $ware_arr['sku_id'] = $val['sku_id']; } $this->MerWarehouseReduce($ware_arr, $val['loss_num']); //串号信息处理 if ($val['serial_number_state'] == 1) { $serial_id_arr = array_column($val['serial_list'], 'id'); $SerialClass->warehouseSerialDec([ 'user_type' => 3, 'serial_id_arr' => $serial_id_arr, 'type' => 1, 'merchant_id' => $merchant_id, ]); } } $moneyTotal += $content['subtotal']; } $text['money_total'] = $moneyTotal; $text['goods_species'] = count($goodsList); $text['status'] = 1; $text['order_number'] = $LossOrderNumber; $success = $LossReportOrderModel->updateData(array('id' => $LossOrderId), $text); if ($success['status'] == 0) { M()->rollback(); return ['status' => 0, 'msg' => '操作失败']; } else { M()->commit(); return ['status' => 1, 'msg' => '操作成功']; } } catch (\Exception $e) { return ['status' => 0, 'msg' => '操作失败']; } } /** * 商户报损提交验证 * @param $param * [ * merchant_id * operator_id * remarks 备注 * goodsList 商品信息 * ] * @return mixed */ public function MerReportSubVerify(&$param) { $reg1 = "/^[0-9]+(.[0-9]{1,2})?$/"; $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; $goodsList = json_decode(htmlspecialchars_decode($param['goodsList']), true); $SaleWarehouseModel = new SaleWarehouseModel(); $warehouse_id = $SaleWarehouseModel->getFindField(array('merchant_id' => $param['merchant_id'], 'status' => 1), "id"); //销售仓库 if (empty($warehouse_id)) { return ['status' => 0, 'msg' => '请先创建供给仓']; } if (empty($goodsList) || empty($param['merchant_id']) || empty($param['operator_id'])) { return ['status' => 0, 'msg' => '参数缺失']; } if (count($goodsList) > 500) { return ['status' => 0, 'msg' => '单次操作上限为500种商品']; } foreach ($goodsList as $key => &$val) { if (!$val['cost_price']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '成本价有误']; } if (!preg_match($reg1, $val['cost_price'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确价格']; } if ($val['attribute_state'] == 1) { if ($val['pricing_method'] == 1) { //无称重 if (!preg_match($reg3, $val['loss_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } else { if (!preg_match($reg2, $val['loss_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . '请输入正确数量']; } } } else if ($val['attribute_state'] == 2) { if (!preg_match($reg3, $val['loss_num'])) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '请输入正确数量']; } } if ($val['loss_num'] > $val['goods_num']) { return ['status' => 0, 'msg' => $val['goods_name'] . $val['sku_name'] . '报损数量不能大于辅助数量']; } //串号信息 if ($val['serial_number_state'] == 1) { if (empty($val['serial_list']) || count($val['serial_list']) != $val['loss_num']) { return ['status' => 0, 'msg' => '请选择报损的串号信息']; } } } $param['goodsList'] = $goodsList; return callBack(statusCode()['success'], '验证成功', $warehouse_id); } /** * 报损详情 */ public function MerReportDetails() { $id = I("post.id"); $where['loss_order_id'] = $id; $detailsList = D('LossReportGoods')->getSelect($where, $page = '', $limit = ''); if ($detailsList) { foreach ($detailsList as $key => &$val) { $val['index'] = $key + 1; $val['loss_num'] = round($val['loss_num'], 3); $val['loss_price'] = round($val['loss_price'], 2); $val['subtotal'] = round($val['subtotal'], 2); $val['sku_num'] = round($val['sku_num'], 3); if ($val['attribute_state'] == 2) { $val['goods_code'] = $val['sku_code']; $val['goods_number'] = $val['sku_goods_number']; } } } $res['data'] = $detailsList; $res['status'] = 1; return $res; } /* * 提交申请 */ public function ApplyOperation($data) { $reg2 = "/^[0-9]+(.[0-9]{1,3})?$/"; $reg3 = "/^\+?[1-9][0-9]*$/"; $merchant_id = $data['merchant_id']; $store_id = $data['store_id']; $time = $_SERVER['REQUEST_TIME']; $goodsList = $data['goodsList']; if (!$merchant_id || !$store_id || !$goodsList) { $res['status'] = 0; $res['msg'] = '缺少参数'; return $res; } $remarks = $data['remarks']; if (count($goodsList) > 500) { $res['status'] = 0; $res['msg'] = '单次操作上限为500种'; return $res; } foreach ($goodsList as $key => &$val) { if (!$val['apply_num']) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量"; return $res; } if ($val['attribute_state'] == 1 && $val['pricing_method'] == 2) { if (!preg_match($reg2, $val['apply_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量"; return $res; } } else { if (!preg_match($reg3, $val['apply_num'])) { $res['status'] = 0; $res['msg'] = $val['goods_name'] . $val['sku_name'] . "请输入正确数量"; return $res; } } } $order = array(); $order['store_id'] = $store_id; $order['merchant_id'] = $merchant_id; $order['add_time'] = $time; $order['status'] = 1; $order['remarks'] = $remarks; $OperatorInfo = A('Api/Inventory')->Operator(session("jurisdiction_user")); if ($OperatorInfo) { $order['s_operator_id'] = $OperatorInfo['id']; } $res = D('AllocationOrder')->addData($order); if ($res['status'] == 0) { $res['msg'] = "订单创建失败"; return $res; } $orderId = $res['data']; $orderNumber = 'SS' . orderNumber($orderId); foreach ($goodsList as $key => &$val) { $content = []; $content['store_id'] = $store_id; $content['merchant_id'] = $merchant_id; $content['allocation_id'] = $orderId; $content['order_number'] = $orderNumber; $content['add_time'] = $time; $content['goods_id'] = $val['goods_id']; $content['goods_name'] = $val['goods_name']; $content['goods_class_id'] = $val['goods_class_id']; $content['goods_number'] = $val['goods_number']; $content['goods_code'] = $val['goods_code']; $content['company'] = $val['company']; $content['attribute_state'] = $val['attribute_state']; $content['pricing_method'] = $val['pricing_method']; $content['apply_num'] = $val['apply_num']; $content['remarks'] = $val['remarks']; $content['serial_number_state'] = $val['serial_number_state'] ? $val['serial_number_state'] : 0; if ($val['attribute_state'] == 2) { $content['sku_id'] = $val['sku_id']; $content['sku_name'] = $val['sku_name']; $content['sku_id_list'] = $val['sku_id_list']; $content['sku_goods_number'] = $val['sku_goods_number']; $content['sku_code'] = $val['sku_code']; $content['sku_num'] = $val['sku_num']; } $res = D('AllocationGoods')->addData($content); if ($res['status'] == 0) { $res['msg'] = '商品存入失败'; return $res; } } $text = array(); $text['store_goods_species'] = count($goodsList); $text['order_number'] = $orderNumber; $res = D('AllocationOrder')->updateData(array('id' => $orderId), $text); if ($res['status'] == 0) { $res['msg'] = '订单修改失败'; return $res; } return $res; } }