1. 【新增】售后单售后原因类型支持搜索

2. 【新增】手工创建订单折扣可输入正数

3. 【优化】盘点申请单确认

4. 【修复】采购退货单模拟出库失败问题

5. 【新增】订单金额客户实付与结算金额

6. 【优化】仓库发货统计报表物料名称显示

7. 【优化】自有仓储虚拟发货逻辑

8. 【修复】基础物料分类管理问题
This commit is contained in:
chenping
2026-04-01 11:59:17 +08:00
parent 9341122827
commit 61783b7d01
754 changed files with 46179 additions and 5700 deletions

View File

@@ -20,10 +20,6 @@ class wms_ctl_admin_consign extends desktop_controller{
var $name = "发货处理";
var $workground = "wms_delivery";
/**
* _views
* @return mixed 返回值
*/
public function _views()
{
@@ -72,7 +68,7 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 逐单发货的入口展示页
*/
function index(){
@@ -110,7 +106,7 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 批量发货的入口展示页
*/
function batch(){
@@ -124,7 +120,7 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 分组发货的入口展示页
*/
function group_consign(){
@@ -199,7 +195,7 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 发货前的发货单相关信息检查
*/
function batchCheck(&$rs = false){
@@ -213,7 +209,7 @@ class wms_ctl_admin_consign extends desktop_controller{
$dlyCheckLib = kernel::single('wms_delivery_check');
//逐个发货:发货判断,批量发货不做此过滤
// 先做系统业务校验consignAllow通过后再针对 pickup 且无 logi_no 时调官方提货
if ($_GET['delivery_type'] == 'single'){
$return_error = $dlyCheckLib->consignAllow('', $logi_nos, $weight);
if ($return_error){
@@ -221,8 +217,16 @@ class wms_ctl_admin_consign extends desktop_controller{
echo json_encode($tmp);
die;
}
$pickup_err=null;
$pickup_err = $this->_batchCheckPickupOfficial($logi_nos);
if ($pickup_err !== null) {
$tmp = array('status'=>'error','msg'=>$pickup_err);
echo json_encode($tmp);
die;
}
}else{
$logi_no_arr = array_unique(explode(',', $logi_nos));
$tmp = array();
$delivery_list = array();
if ($logi_no_arr){
@@ -240,14 +244,76 @@ class wms_ctl_admin_consign extends desktop_controller{
}
}
if ($tmp){
if (!empty($tmp)){
echo json_encode($tmp); die;
}
$rs = true;#发货判断完成的标示,这个对校验完成即发货有用
if ($_GET['delivery_type'] == 'single') {
$dlyObj = app::get('wms')->model('delivery');
$deliveryBillLib = kernel::single('wms_delivery_bill');
$delivery_id = $deliveryBillLib->getDeliveryIdByPrimaryLogi($logi_nos);
if (empty($delivery_id)) {
$delivery_id = $deliveryBillLib->getDeliveryIdBySecondaryLogi($logi_nos);
}
if (empty($delivery_id)) {
$pickupDly = $dlyObj->dump(array('delivery_bn' => $logi_nos, 'delivery_model' => 'pickup'), 'delivery_id');
if (!empty($pickupDly)) {
$delivery_id = $pickupDly['delivery_id'];
}
}
$is_pickup = false;
if ($delivery_id) {
$dly = $dlyObj->dump(array('delivery_id' => $delivery_id), 'delivery_model');
$is_pickup = (isset($dly['delivery_model']) && $dly['delivery_model'] === 'pickup');
}
header('Content-Type: application/json; charset=utf-8');
echo json_encode(array('status' => 'ok', 'is_pickup' => $is_pickup));
return;
}
echo "";
}
/**
* pickup 单:仅当 logi_no 为空时调官方提货,已有 logi_no 则不请求;失败返回错误文案(兼容 PHP5.2,不用闭包)
* @param string $scan_val 扫描值(对应界面「输入快递单号」/ POST delivery_id可为发货单号
* @return string|null 失败时返回错误信息,否则 null
*/
private function _batchCheckPickupOfficial($scan_val)
{
$deliveryBillLib = kernel::single('wms_delivery_bill');
$dlyObj = app::get('wms')->model('delivery');
$dlyBillObj = app::get('wms')->model('delivery_bill');
$delivery_id = $deliveryBillLib->getDeliveryIdByPrimaryLogi($scan_val);
if ($delivery_id === null) {
$delivery_id = $deliveryBillLib->getDeliveryIdBySecondaryLogi($scan_val);
}
if ($delivery_id === null) {
$pickupDly = $dlyObj->dump(array('delivery_bn' => $scan_val, 'delivery_model' => 'pickup'), 'delivery_id');
if ($pickupDly) {
$delivery_id = $pickupDly['delivery_id'];
}
}
if (empty($delivery_id)) {
return null;
}
$dly = $dlyObj->dump(array('delivery_id' => $delivery_id), 'delivery_id,delivery_model');
if (empty($dly) || !isset($dly['delivery_model']) || $dly['delivery_model'] !== 'pickup') {
return null;
}
$bill = $dlyBillObj->db_dump(array('delivery_id' => $delivery_id, 'type' => 1), 'logi_no');
// 已有 logi_no 则不请求官方提货,避免重复调用
if (!empty($bill['logi_no'])) {
return null;
}
$ret = kernel::single('wms_logistics')->officialPickup($delivery_id);
if (is_array($ret) && isset($ret['rsp']) && $ret['rsp'] === 'fail') {
return isset($ret['msg']) ? $ret['msg'] : '官方提货失败';
}
return null;
}
function batch_log_detail(){
$log_id = $_GET['log_id'];
$filter = array('log_id'=>$log_id);
@@ -263,7 +329,7 @@ class wms_ctl_admin_consign extends desktop_controller{
$this->display('admin/delivery/batch_log_detail.html');
}
/**
/**
* 批量发货确认
* 显示批量发货订单中有退款申请或已退款的订单,让管理员确认是否发货或不发货
* @param json $data
@@ -276,7 +342,7 @@ class wms_ctl_admin_consign extends desktop_controller{
/**
* 发货处理
*
*
*/
function consign($is_from_check = false){
if($is_from_check){
@@ -312,7 +378,15 @@ class wms_ctl_admin_consign extends desktop_controller{
$logi_no = $dlyBillInfo['logi_no'];
}
}
// [提货物流] delivery_model='pickup' 运单号后取,扫描的是发货单号
if (empty($delivery_id)) {
$pickupDly = $dlyObj->dump(array('delivery_bn' => $logi_no, 'delivery_model' => 'pickup'), 'delivery_id');
if ($pickupDly) {
$delivery_id = $pickupDly['delivery_id'];
}
}
if(!is_null($delivery_id)){
$primary = true;
$dly = $dlyObj->dump(array('delivery_id' => $delivery_id),'*',array('delivery_items'=>array('*')));
@@ -327,6 +401,14 @@ class wms_ctl_admin_consign extends desktop_controller{
$logi_number = $dly['logi_number'];
$delivery_logi_number =$dly['delivery_logi_number'];
// 确认出库成功后用于触发的快递单打印(仅 delivery_model=pickup 时返回,前端将拉取 toPrintExpre 同源数据并直接触发菜鸟打印)
$consignExtra = (isset($dly['delivery_model']) && $dly['delivery_model'] === 'pickup')
? array(
'print_delivery_id' => $dly['delivery_id'],
'print_logi_id' => $dly['logi_id'],
)
: array();
//检查前端订单是否退款,原有逻辑是否需要?
//danny_freeze_stock_log
@@ -363,7 +445,7 @@ class wms_ctl_admin_consign extends desktop_controller{
if(($logi_number==$delivery_logi_number)&&$dly['status'] != 3){
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
}else {
$msg['delivery_bn'] = $dly['delivery_bn'];
$this->end(false, '发货未完成', '', array('msg'=>$msg));
@@ -375,13 +457,13 @@ class wms_ctl_admin_consign extends desktop_controller{
if($logi_number==($delivery_logi_number+1)){
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
}else {
$msg['delivery_bn'] = $dly['delivery_bn'];
$this->end(false, '发货未完成', '', array('msg'=>$msg));
}
}else{
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
}
}
}else{
@@ -389,7 +471,7 @@ class wms_ctl_admin_consign extends desktop_controller{
if($logi_number == 1){
if(($logi_number==$delivery_logi_number)&&$dly['status'] != 3){
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
}else {
$msg['delivery_bn'] = $dly['delivery_bn'];
$this->end(false, '发货未完成', '', array('msg'=>$msg));
@@ -410,7 +492,7 @@ class wms_ctl_admin_consign extends desktop_controller{
$dlyObj->update($data,$filter);
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
}else {
$msg['delivery_bn'] = $dly['delivery_bn'];
$this->end(false, '发货未完成', '', array('msg'=>$msg));
@@ -441,17 +523,17 @@ class wms_ctl_admin_consign extends desktop_controller{
if($logi_number==($delivery_logi_number+1)){
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
}else {
$msg['delivery_bn'] = $dly['delivery_bn'];
$this->end(false, '发货未完成', '', array('msg'=>$msg));
}
}
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
//加入如果$logi_number==$delivery_logi_number 但是发货状态没有改变的判断
}elseif(($delivery_logi_number == $logi_number) && $dly['status'] != 3){
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
$this->end(true, '发货处理完成');
$this->_endConsignSuccess($consignExtra);
}else {
$msg['delivery_bn'] = $dly['delivery_bn'];
$this->end(false, '发货未完成', '', array('msg'=>$msg));
@@ -464,7 +546,39 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
* 生成确认出库成功后的快递单打印页链接(与 admin_receipts_print toPrintExpre 参数一致)
* @param int|string $delivery_id wms 发货单 id
* @param int|string $logi_id 物流公司 id
* @return string
*/
protected function _getConsignPrintExpreUrl($delivery_id, $logi_id) {
return 'index.php?app=wms&ctl=admin_receipts_print&act=toPrintExpre&status=3&logi_id=' . urlencode((string)$logi_id) . '&delivery_id=' . urlencode((string)$delivery_id);
}
/**
* consign 成功返回封装:
* - pickup 场景:返回纯 JSON避免 desktop 的 splash/doCommand 触发 redirect 打断自动打印流程
* - 其他场景:保持原有 end() 行为
*
* @param array $consignExtra
*/
protected function _endConsignSuccess($consignExtra = array())
{
if (is_array($consignExtra) && isset($consignExtra['print_delivery_id']) && $consignExtra['print_delivery_id']) {
// 先提交事务(与 end() 一致),再返回纯 JSON避免 desktop 的 splash/redirect 打断自动打印
$this->endonly(true);
header('Content-Type: application/json; charset=utf-8');
$out = array_merge(array('success' => '成功:发货处理完成'), $consignExtra);
$out['redirect'] = 'index.php?app=wms&ctl=admin_consign&act=index';
echo json_encode($out);
exit;
}
// 非 pickup保持原有 end(),框架会处理 splash/redirect
$this->end(true, '发货处理完成', null, $consignExtra);
}
/**
*
* 分组发货执行方法
*/
function ajaxDoGroupConsign(){
@@ -517,7 +631,11 @@ class wms_ctl_admin_consign extends desktop_controller{
$fail = 0;
$failInfo = array();
foreach($deliverys as $value){
if (isset($value['delivery_model']) && $value['delivery_model'] === 'pickup'){
$fail++;
$failInfo[] = $value['delivery_bn'] . '(提货单不支持分组发货)';
continue;
}
$weight = $value['net_weight']>0 ? $value['net_weight'] : $group_weight;
$weight = $weight ? $weight : $minWeight;
@@ -615,7 +733,7 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 补打物流单入口页
*/
public function fill_delivery(){
@@ -623,7 +741,7 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 补打物流单的详细页
*/
public function fill_delivery_confirm(){
@@ -736,10 +854,10 @@ class wms_ctl_admin_consign extends desktop_controller{
// die;
}
/**
*
* 删除子快递单
*/
/**
*
* 删除子快递单
*/
function del_deliveryBill(){
$b_id = $_POST['b_id'];
$delivery_id = $_POST['delivery_id'];
@@ -903,8 +1021,8 @@ class wms_ctl_admin_consign extends desktop_controller{
}
}
/**
*
/**
*
* 快递单状态翻译显示
*/
function statusinfo($status,$style=1){
@@ -929,9 +1047,9 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 保存批量发货至记录队列表中
*/
*/
function doBatchConsign(){
$goto_url = 'index.php?app=wms&ctl=admin_consign&act=batch';
$ids = $_POST['delivery_id'];
@@ -971,8 +1089,8 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
* 获取发货记录历史
*/
*获取发货记录历史
*/
function batchConsignLog(){
$blObj = app::get('wms')->model('batch_log');
$batchLogLib = kernel::single('wms_batch_log');
@@ -993,7 +1111,7 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
*
*
* 更新处理中发货记录值
*/
function updateBatchConsignLog(){
@@ -1019,8 +1137,8 @@ class wms_ctl_admin_consign extends desktop_controller{
/**
* 商品重量报警判断
*/
* 商品重量报警判断
*/
function weightWarn(){
$type = $_GET['type'];
$logi_no = $_POST['logi_no'];
@@ -1056,8 +1174,8 @@ class wms_ctl_admin_consign extends desktop_controller{
}
/**
* 发货重量报警页面提醒
*/
* 发货重量报警页面提醒
*/
function showWeightWarn(){
$logi_no = $_GET['logi_no'];
@@ -1122,7 +1240,7 @@ class wms_ctl_admin_consign extends desktop_controller{
/**
* 极速发货
*
*
* @param void
* @return void
*/
@@ -1183,6 +1301,14 @@ class wms_ctl_admin_consign extends desktop_controller{
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
$deliveryBill = $dlyBillMdl->db_dump(['logi_no' => $logi_no]);
// [提货物流] delivery_model='pickup' 运单号后取,扫描的是发货单号(delivery_bn),按 delivery_bn 查主单
if (empty($deliveryBill)) {
$pickupDly = $dlyMdl->dump(array('delivery_bn' => $logi_no, 'delivery_model' => 'pickup'), 'delivery_id');
if ($pickupDly) {
$deliveryBill = $dlyBillMdl->db_dump(array('delivery_id' => $pickupDly['delivery_id'], 'type' => 1));
}
}
//[同城配]商家配送支持配送员手机号搜索
if(empty($deliveryBill) && strlen($logi_no) == 11){
@@ -1299,7 +1425,7 @@ class wms_ctl_admin_consign extends desktop_controller{
//检查运单号是否属于同一个处理的发货单
$deliveryBillLib = kernel::single('wms_delivery_bill');
$db_logi_no = $deliveryBillLib->getPrimaryLogiNoById($dly_id);
if ($db_logi_no != $logi_no){
if ($db_logi_no != $logi_no && $dly['delivery_model'] != 'pickup'){
$tmp = array('result'=>false,'msg'=>'扫描的快递单号与系统中的快递单号不对应');
echo json_encode($tmp);die;
}