mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-23 10:55:34 +08:00
571 lines
21 KiB
PHP
571 lines
21 KiB
PHP
<?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;
|
||
}
|
||
} |