Files
OMS/app/console/model/difference/receiving/inventory.php
2025-12-28 23:13:25 +08:00

571 lines
21 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
class console_mdl_difference_receiving_inventory extends dbeav_model
{
public $defaultOrder = array('di.diff_status ASC, di.diff_id DESC');
//是否有导出配置
var $has_export_cnf = true;
public $export_name = '差异单列表';
public function exportName(&$data, $filter = array())
{
$data['name'] = $this->export_name . '-' . date('Y-m-d H:i:s', time());
}
/**
* 获取_schema
* @return mixed 返回结果
*/
public function get_schema()
{
$schema['idColumn'] = $schema['pkeys'] = 'diff_id';
$schema['textColumn'] = 'diff_id';
$schema['columns'] = array(
'diff_id' => array(
'label' => 'diff_id',
),
'creat_time' => array(
'label' => '创建时间',
'default_in_list' => true,
'in_list' => true,
'width' => 130,
'order' => 10,
),
'diff_bn' => array(
'label' => '差异单号',
'default_in_list' => true,
'in_list' => true,
'filtertype' => 'normal',
'filterdefault' => true,
'panel_id' => 'console_difference_receiving_inventory_filter_top',
'width' => 130,
'order' => 15,
),
'relevant_bn' => array(
'label' => '业务单号',
'default_in_list' => true,
'in_list' => true,
'filtertype' => 'normal',
'filterdefault' => true,
'panel_id' => 'console_difference_receiving_inventory_filter_top',
'width' => 125,
'order' => 20,
),
'packaging_status' => array(
'label' => '外箱状态',
'default_in_list' => true,
'in_list' => true,
'width' => 80,
'order' => 24,
),
'diff_nums' => array(
'label' => '差异SKU',
'default_in_list' => false,
'in_list' => false,
'width' => 70,
'order' => 25,
),
'abs_diff_nums' => array(
'label' => '差异数量', // 统计绝对值
'default_in_list' => false,
'in_list' => false,
'width' => 70,
'order' => 26,
),
'status' => array(
'label' => '单据状态',
'default_in_list' => true,
'in_list' => true,
'width' => 70,
'order' => 30,
),
'oper' => array(
'label' => '处理人',
'default_in_list' => true,
'in_list' => true,
'width' => 70,
'order' => 35,
),
'confirm_time' => array(
'label' => '处理时间',
'default_in_list' => true,
'in_list' => true,
'width' => 140,
'order' => 40,
),
);
foreach ($schema['columns'] as $key => $val) {
$val['in_list'] == true and $schema['in_list'][] = $key;
$val['default_in_list'] == true and $schema['default_in_list'][] = $key;
}
return $schema;
}
public function finder_getList($cols = '*', $filter = array(), $offset = 0, $limit = -1, $orderType = null)
{
$cols = 'di.branch_id,di.extrabranch_id,di.packaging_status,di.diff_id,di.create_time as creat_time,di.diff_bn,di.original_bn as relevant_bn,di.diff_status as status,di.operator as oper,di.up_time as confirm_time';
$sql = "SELECT $cols FROM sdb_taoguaniostockorder_diff di
LEFT JOIN sdb_taoguaniostockorder_iso AS i ON di.original_id = i.iso_id
WHERE " . $this->finder_filter($filter);
$orderType = $orderType ? $orderType : $this->defaultOrder[0];
if ($orderType) {
$sql .= ' ORDER BY ' . (is_array($orderType) ? implode($orderType, ' ') : $orderType);
}
$data = $this->db->selectLimit($sql, $limit, $offset);
if (!$data) {
return $data;
}
return $data;
}
/**
* 查找er_count
* @param mixed $filter filter
* @return mixed 返回结果
*/
public function finder_count($filter = null)
{
$row = $this->db->select("SELECT count(*) as _count FROM sdb_taoguaniostockorder_diff di
LEFT JOIN sdb_taoguaniostockorder_iso AS i ON di.original_id = i.iso_id
WHERE " . $this->finder_filter($filter));
return intval($row[0]['_count']);
}
/**
* 查找er_filter
* @param mixed $filter filter
* @param mixed $tableAlias tableAlias
* @param mixed $baseWhere baseWhere
* @return mixed 返回结果
*/
public function finder_filter($filter, $tableAlias = null, $baseWhere = null)
{
$where = [];
// 快照时间
if ($filter['diff_id']) {
if (is_array($filter['diff_id'])) {
$str_ids = '"' . implode('","', $filter['diff_id']) . '"';
$where[] = " di.diff_id IN ($str_ids)";
} else {
$where[] = " di.diff_id = " . $filter['diff_id'];
}
}
unset($filter['diff_id']);
if ($filter['bill_type']) {
if (is_array($filter['bill_type'])) {
$str_ids = '"' . implode('","', $filter['bill_type']) . '"';
$where[] = " i.bill_type IN ($str_ids)";
} else {
$where[] = " i.bill_type = '" . $filter['bill_type'] . '\'';
}
}
unset($filter['bill_type']);
//只获取店铺差异
if ($filter['branch_id']) {
if (is_array($filter['branch_id'])) {
$str_branch_id = '"' . implode('","', $filter['branch_id']) . '"';
$where[] = " di.branch_id IN ($str_branch_id)";
} else {
$where[] = " di.branch_id = '" . $filter['branch_id'] . '\'';
}
}
unset($filter['branch_id']);
if ($filter['extrabranch_id']) {
if (is_array($filter['extrabranch_id'])) {
$str_branch_id = '"' . implode('","', $filter['extrabranch_id']) . '"';
$where[] = " di.extrabranch_id IN ($str_branch_id)";
} else {
$where[] = " di.extrabranch_id = '" . $filter['extrabranch_id'] . '\'';
}
}
unset($filter['extrabranch_id']);
if (isset($filter['relevant_bn'])) {
$filter['relevant_bn'] && $where[] = " di.original_bn = '" . $filter['relevant_bn'] . "'";
unset($filter['relevant_bn']);
}
if (isset($filter['diff_bn'])) {
$filter['diff_bn'] && $where[] = " di.diff_bn = '" . $filter['diff_bn'] . "'";
unset($filter['diff_bn']);
}
$sqlstr = '';
if ($where) {
$sqlstr .= implode(' AND ', $where) . " AND ";
}
return $sqlstr . parent::_filter($filter, $tableAlias, $baseWhere);
}
/**
* 处理状态
* @param null $status
* @return string|string[]
*/
public function diff_status($status = NULL)
{
$diff_status = array(
1 => '未处理',
2 => '部分处理',
3 => '全部处理',
4 => '取消',
);
if ($status == NULL) {
return $diff_status;
} else {
return $diff_status[$status];
}
}
public function modifier_status($status, $list, $row)
{
return $this->diff_status($status);
}
public function modifier_oper($oper, $list, $row)
{
if (in_array($row['status'], ['2', '3'])) {
return $oper;
}
return '';
}
public function modifier_confirm_time($confirm_time, $list, $row)
{
if ($confirm_time && in_array($row['status'], ['2', '3'])) {
return $confirm_time;
}
return '';
}
/**
* modifier_creat_time
* @param mixed $creat_time creat_time
* @param mixed $list list
* @param mixed $row row
* @return mixed 返回值
*/
public function modifier_creat_time($creat_time, $list, $row)
{
if ($creat_time) {
return date('Y-m-d H:i:s', $creat_time);
}
return '';
}
/**
* 获取大仓
* @return array
*/
public static function getShopBranches()
{
static $branches;
if ($branches) {
return $branches;
}
// 大仓库存
$branchMdl = app::get('ome')->model('branch');
$brancheList = $branchMdl->getList('branch_id,branch_bn', [
'b_type|in' => ['2', '3'],
'check_permission' => 'false',
'disabled' => 'false',
]);
$branchIdList = array_column($brancheList, null, 'branch_id');
return $branchIdList;
}
/**
* modifier_packaging_status
* @param mixed $packaging_status packaging_status
* @param mixed $list list
* @param mixed $row row
* @return mixed 返回值
*/
public function modifier_packaging_status($packaging_status, $list, $row)
{
return $packaging_status == 'intact' ? '完好' : '有破损';
}
/**
* 根据查询条件获取导出数据
* @param $fields
* @param $filter
* @param $has_detail
* @param $curr_sheet
* @param $start
* @param $end
* @param $op_id
* @return bool
* @author db
* @date 2023-07-10 4:13 下午
*/
public function getExportDataByCustom($fields, $filter, $has_detail, $curr_sheet, $start, $end, $op_id)
{
//根据选择的字段定义导出的第一行标题
if ($curr_sheet == 1) {
$title = array();
$main_columns = array_flip($this->io_title());
$filde_columns = [];
foreach (explode(',', $fields) as $k => $col) {
//处理column_标识
if ('column_' == substr($col, 0, 7)) {
$col = substr($col, 7);
}
if (isset($main_columns[$col])) {
$title[] = $main_columns[$col];
$filde_columns[] = $col;
}
}
$data['content']['main'][] = $this->getCustomExportTitle($title);
}
if (!$omedelivery = $this->finder_getList('*', $filter)) {
return false;
}
//获取lib里的扩展字段值
$export_fields = 'column_branch_bn,column_extrabranch_bn,column_diff_nums,column_abs_diff_nums';
$finderObj = kernel::single('console_finder_difference_receiving_inventory');
foreach ($omedelivery as $key=>$aFilter) {
foreach (explode(',', $export_fields) as $v) {
if ('column_' == substr($v, 0, 7) && method_exists($finderObj, $v)) {
$cv = $finderObj->{$v}($aFilter, $omedelivery);
$omedelivery[$key][substr($v,7)] = $cv;
}
}
}
//明细标题
$basicMaterialLib = kernel::single('material_basic_material');
$diffItemsMdl = app::get('taoguaniostockorder')->model('diff_items');
$order_items_columns = array_values($this->orderItemsExportTitle());
$items_fields = implode(',', $order_items_columns);
$diff_status = [
1 => '未处理',
2 => '部分处理',
3 => '全部处理',
4 => '取消',
];
foreach ($omedelivery as $k => $aFilter) {
$aFilter['creat_time'] = $aFilter['creat_time'] ? date('Y-m-d H:i:s', $aFilter['creat_time']) : '';
$aFilter['packaging_status'] = $aFilter['packaging_status']== 'intact' ? '完好' : '有破损';
$aFilter['status'] = $diff_status[$aFilter['status']];
//查明细
$diff_items = $diffItemsMdl->getList('*', ['diff_id' => $aFilter['diff_id']]);
foreach ($diff_items as $itemk => $itemv) {
$product = $basicMaterialLib->getBasicMaterialExt($itemv['product_id']);
$diffItemObjRow = array();
$diffItemObjRow['product_name'] = str_replace("\n", " ", $itemv['product_name']);
$diffItemObjRow['bn'] = $itemv['bn'];
$diffItemObjRow['barcode'] = $itemv['barcode'];
$diffItemObjRow['barcode'] = $product['barcode'];
$index = $aFilter['relevant_bn'] . '_' . $itemv['bn'];
//获取出库和入库数量
$info = $this->getIsoData($index, $diff_items);
$diffItemObjRow['from_item_num'] = $info['from_item_num'];
$diffItemObjRow['to_item_num'] = $info['to_item_num'];
$diffItemObjRow['diff_item_num'] = $info['diff_item_num'];
$diffItemObjRow['adjustment_bn'] = $info['adjustment_bn'];
$diff_reason = $diffItemsMdl->diff_reason;//结果
$diffItemObjRow['diff_memo'] = $diff_reason[$itemv['diff_reason']];//差异备注
$diffItemObjRow['responsible_value'] = $diffItemsMdl->responsible[$itemv['responsible']];//责任方
$diff_status = $diffItemsMdl->diff_status;
$diffItemObjRow['diff_status_value'] = $diff_status[$itemv['diff_status']];
$diffItemObjRow['operator'] = $itemv['operator'];
$orderdataRow = array_merge($aFilter, $diffItemObjRow);
$all_fields = implode(',', $filde_columns) . ',' . $items_fields;//主表 拼接 明细表字段
$exptmp_data = [];
foreach (explode(',', $all_fields) as $key => $col) {
if (isset($orderdataRow[$col])) {
$orderdataRow[$col] = mb_convert_encoding($orderdataRow[$col], 'GBK', 'UTF-8');
$exptmp_data[] = $orderdataRow[$col];
} else {
$exptmp_data[] = '';
}
}
$data['content']['main'][] = implode(',', $exptmp_data);
}
}
return $data;
}
/**
* 组装导出的数据
* @param $bn_iso_bn
* @param $list
* @return mixed
* @author db
* @date 2023-07-10 4:10 下午
*/
public function getIsoData($bn_iso_bn, $list)
{
static $iso;
if (isset($iso[$bn_iso_bn])) {
return $iso[$bn_iso_bn];
}
$diff_obj = app::get('taoguaniostockorder')->model("diff");
$diff_items_obj = app::get('taoguaniostockorder')->model("diff_items");
$isoItemsMdl = app::get('taoguaniostockorder')->model("iso_items");
$diff_bns = array_column($list, 'diff_bn');
$diffList = $diff_obj->getList('*', ['diff_bn' => $diff_bns]);
$diffList = array_column($diffList, null, 'diff_id');
$diff_ids = array_column($list, 'diff_id');
$diffItemsList = $diff_items_obj->getList('*', ['diff_id' => $diff_ids]);
$original_bns = array_column($diffList, 'original_bn');
//收发货明细
$isoItemsList = $isoItemsMdl->getList('product_id,bn,nums,normal_num,defective_num,iso_bn', array('iso_bn' => $original_bns));
$newIsoItemsList = [];
foreach ($isoItemsList as $k => $item) {
$index = $item['iso_bn'] . '_' . $item['bn'];
$newIsoItemsList[$index] = $item;
}
$adjustMdl = app::get('console')->model('adjust');
$adjustItemsMdl = app::get('console')->model('adjust_items');
$adjust = $adjustMdl->getList('id, adjust_bn,origin_bn', ['origin_bn' => $diff_bns]);
$adjust = array_column($adjust, null, 'id');
$adjustId = array_column($adjust, 'id');
$ajustItems = $adjustItemsMdl->getList('bm_id, adjust_id,bm_bn', ['adjust_id|in' => $adjustId]);
$ajustItems = array_column($ajustItems, null, 'bm_id');
$newAdjustItems = [];
foreach ($ajustItems as $key => $adjust_item) {
$adjustInfo = $adjust[$adjust_item['adjust_id']];
$index = $adjustInfo['origin_bn'] . '_' . $adjust_item['bm_bn'];
$newAdjustItems[$index]['adjust_bn'] = $adjustInfo['adjust_bn'];
}
foreach ($diffItemsList as $key => $diff_item) {
$diffInfo = $diffList[$diff_item['diff_id']];
$index = $diffInfo['original_bn'] . '_' . $diff_item['bn'];
//发货数量
$from_item_num = $newIsoItemsList[$index]['nums'];
$iso[$index]['from_item_num'] = $from_item_num ? $from_item_num : 0;
//收货数量
$to_item_nums = $newIsoItemsList[$index]['normal_num'] + $newIsoItemsList[$index]['defective_num'];
$iso[$index]['to_item_num'] = $to_item_nums;
//差异数量
$diff_item_num = $from_item_num - $to_item_nums;
$iso[$index]['diff_item_num'] = $diff_item_num;
//调整单号
$index2 = $diffInfo['diff_bn'] . '_' . $diff_item['bn'];
$iso[$index]['adjustment_bn'] = $newAdjustItems[$index2] ? $newAdjustItems[$index2]['adjust_bn'] : '';
}
return $iso[$bn_iso_bn];
}
/**
* 获取CustomExportTitle
* @param mixed $main_title main_title
* @return mixed 返回结果
*/
public function getCustomExportTitle($main_title)
{
$main_title = $main_title;
$order_items_title = array_keys($this->orderItemsExportTitle());
$title = array_merge($main_title, $order_items_title);
return mb_convert_encoding(implode(',', $title), 'GBK', 'UTF-8');
}
/**
* orderItemsExportTitle
* @return mixed 返回值
*/
public function orderItemsExportTitle()
{
$items_title = array(
'基础物料名称' => 'product_name',
'基础物料编码' => 'bn',
'条形码' => 'barcode',
'发货数量' => 'from_item_num',
'收货数量' => 'to_item_num',
'差异数量' => 'diff_item_num',
'责任方' => 'responsible_value',
'差异备注' => 'diff_memo',
'处理状态' => 'diff_status_value',
'调整单号' => 'adjustment_bn',
'操作人员' => 'operator',
);
return $items_title;
}
//根据过滤条件获取导出发货单的主键数据数组
/**
* 获取PrimaryIdsByCustom
* @param mixed $filter filter
* @param mixed $op_id ID
* @return mixed 返回结果
*/
public function getPrimaryIdsByCustom($filter, $op_id)
{
$cols = 'di.diff_id';
$sql = "SELECT $cols FROM sdb_taoguaniostockorder_diff di LEFT JOIN sdb_taoguaniostockorder_iso AS i ON di.original_id = i.iso_id WHERE " . $this->finder_filter($filter);
$data = $this->db->select($sql);
$ids = [];
if ($data) {
$ids = array_column($data, 'diff_id');
}
return $ids;
}
/**
* io_title
* @return mixed 返回值
*/
public function io_title()
{
$import_title = [
'创建时间' => 'creat_time',
'差异单号' => 'diff_bn',
'业务单号' => 'relevant_bn',
'收货仓编码' => 'branch_bn',
'发货仓编码' => 'extrabranch_bn',
'差异SKU' => 'diff_nums',
'差异数量' => 'abs_diff_nums',
'外箱状态' => 'packaging_status',
'单据状态' => 'status',
'处理人' => 'oper',
'处理时间' => 'confirm_time',
];
return $import_title;
}
}