|
|
@@ -637,6 +637,83 @@ class CostAccounting extends Api
|
|
|
$this->success('成功', $data);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 水电气科目(前端 search)→ 成本v23_月度成本明细 汇总表达式
|
|
|
+ */
|
|
|
+ private function resolveCostDetailSubjectSumExpression(string $search): ?string
|
|
|
+ {
|
|
|
+ $search = trim($search);
|
|
|
+ if ($search === '') {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (in_array($search, ['待分摊总额', '分摊总额', '分摊水电'], true)) {
|
|
|
+ return 'sum(m.`分摊水电`)';
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($search === '热水锅炉') {
|
|
|
+ return 'sum(m.`热水锅炉`)';
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($search === '锅炉' || (mb_strpos($search, '锅炉') !== false && mb_strpos($search, '热水') === false)) {
|
|
|
+ return 'sum(m.`锅炉` + m.`热水锅炉`)';
|
|
|
+ }
|
|
|
+
|
|
|
+ $keywordToColumn = [
|
|
|
+ '6#楼真空鼓风' => '真空鼓风机',
|
|
|
+ '真空鼓风' => '真空鼓风机',
|
|
|
+ '真空风机' => '真空鼓风机',
|
|
|
+ '6#楼空压机' => '空压机',
|
|
|
+ '空压机' => '空压机',
|
|
|
+ '空压' => '空压机',
|
|
|
+ '废气处理' => '废气处理',
|
|
|
+ '废气' => '废气处理',
|
|
|
+ '中央空调' => '中央空调',
|
|
|
+ '空调' => '中央空调',
|
|
|
+ ];
|
|
|
+
|
|
|
+ foreach ($keywordToColumn as $keyword => $column) {
|
|
|
+ if ($search === $keyword || mb_strpos($search, $keyword) !== false) {
|
|
|
+ return 'sum(m.`' . $column . '`)';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $allowedColumns = ['分摊水电', '直接水电', '空压机', '真空鼓风机', '中央空调', '废气处理', '锅炉', '热水锅炉'];
|
|
|
+ if (in_array($search, $allowedColumns, true)) {
|
|
|
+ return 'sum(m.`' . $search . '`)';
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否按设备档案「使用部门」过滤(仅真实生产车间)
|
|
|
+ */
|
|
|
+ private function shouldFilterMachineByWorkshopDepartment(string $sist): bool
|
|
|
+ {
|
|
|
+ static $workshops = ['胶印车间', '凹丝印车间', '印后车间', '检验车间'];
|
|
|
+
|
|
|
+ return in_array($sist, $workshops, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @param array $rows 含 sczl_jtbh、hours 字段的查询结果
|
|
|
+ * @return array<string, float>
|
|
|
+ */
|
|
|
+ private function buildMachineHoursMap(array $rows): array
|
|
|
+ {
|
|
|
+ $map = [];
|
|
|
+ foreach ($rows as $row) {
|
|
|
+ $machine = trim((string)($row['sczl_jtbh'] ?? ''));
|
|
|
+ if ($machine === '') {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $map[$machine] = floatval($row['hours'] ?? 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $map;
|
|
|
+ }
|
|
|
+
|
|
|
//计算每个车间色度数
|
|
|
private function CountSistChromaticity($month,$sist)
|
|
|
{
|
|
|
@@ -659,22 +736,92 @@ class CostAccounting extends Api
|
|
|
return $data;
|
|
|
}
|
|
|
|
|
|
- //水电气分摊费用下方明细列表
|
|
|
-// public function shuidianqiMachineDetailList()
|
|
|
-// {
|
|
|
-// if ($this->request->isGet() === false) {
|
|
|
-// $this->error('请求错误');
|
|
|
-// }
|
|
|
-// $param = $this->request->param();
|
|
|
-// if (empty($param)) {
|
|
|
-// $this->error('参数错误');
|
|
|
-// }
|
|
|
-// $list = db('设备_基本资料')
|
|
|
-// ->alias('a')
|
|
|
-// ->join('成本_各月分摊系数 b', 'a.设备编号 = b.设备编号', 'LEFT')
|
|
|
-// ->field()
|
|
|
-//
|
|
|
-// }
|
|
|
+ /**
|
|
|
+ * 水电气分摊费用下方机台明细列表
|
|
|
+ * @ApiMethod GET
|
|
|
+ * @param string month 年月 YYYYMM
|
|
|
+ * @param string sist 分摊费用部门(如公用设备设施分摊、胶印车间等)
|
|
|
+ * @param string search 科目名称(对应成本v23_月度成本明细字段,由水电气基础科目映射)
|
|
|
+ */
|
|
|
+ public function shuidianqiMachineDetailList()
|
|
|
+ {
|
|
|
+ if ($this->request->isGet() === false) {
|
|
|
+ $this->error('请求错误');
|
|
|
+ }
|
|
|
+ $param = $this->request->param();
|
|
|
+ if (empty($param['month'])) {
|
|
|
+ $this->error('月份参数错误');
|
|
|
+ }
|
|
|
+
|
|
|
+ $month = trim($param['month']);
|
|
|
+ if (!preg_match('/^\d{6}$/', $month)) {
|
|
|
+ $this->error('月份格式应为 YYYYMM');
|
|
|
+ }
|
|
|
+ $monthDash = substr($month, 0, 4) . '-' . substr($month, 4, 2);
|
|
|
+ $sist = trim((string)($param['sist'] ?? ''));
|
|
|
+ $search = trim((string)($param['search'] ?? ''));
|
|
|
+
|
|
|
+ if ($search === '') {
|
|
|
+ $this->error('缺少科目参数 search');
|
|
|
+ }
|
|
|
+
|
|
|
+ $subjectSumExpr = $this->resolveCostDetailSubjectSumExpression($search);
|
|
|
+ if ($subjectSumExpr === null) {
|
|
|
+ $this->success('成功', []);
|
|
|
+ }
|
|
|
+
|
|
|
+ $query = db('成本v23_月度成本明细')
|
|
|
+ ->alias('m')
|
|
|
+ ->join('设备_基本资料 a', 'a.设备编号 = m.sczl_jtbh', 'LEFT')
|
|
|
+ ->where('m.sys_ny', $month);
|
|
|
+
|
|
|
+ if ($sist !== '' && $this->shouldFilterMachineByWorkshopDepartment($sist)) {
|
|
|
+ $query->where('m.车间名称', $sist);
|
|
|
+ }
|
|
|
+
|
|
|
+ $list = $query
|
|
|
+ ->field([
|
|
|
+ 'rtrim(m.sczl_jtbh) as 设备编号',
|
|
|
+ 'rtrim(a.设备名称) as 设备名称',
|
|
|
+ 'm.sys_ny as 年月',
|
|
|
+ 'rtrim(a.使用部门) as 使用部门',
|
|
|
+ $subjectSumExpr . ' as 科目金额',
|
|
|
+ ])
|
|
|
+ ->group('m.sczl_jtbh, m.sys_ny, a.设备名称, a.使用部门')
|
|
|
+ ->having($subjectSumExpr . ' > 0')
|
|
|
+ ->order('a.使用部门, m.sczl_jtbh')
|
|
|
+ ->select();
|
|
|
+
|
|
|
+ $allHoursMap = $this->buildMachineHoursMap(
|
|
|
+ db('设备_产量计酬')
|
|
|
+ ->field('sczl_jtbh, sum(sczl_设备运行工时) as hours')
|
|
|
+ ->where('sczl_rq', 'like', $monthDash . '%')
|
|
|
+ ->group('sczl_jtbh')
|
|
|
+ ->select()
|
|
|
+ );
|
|
|
+
|
|
|
+ $costHoursMap = $this->buildMachineHoursMap(
|
|
|
+ db('成本v23_月度成本明细')
|
|
|
+ ->field('sczl_jtbh, sum(占用机时) as hours')
|
|
|
+ ->where('sys_ny', $month)
|
|
|
+ ->group('sczl_jtbh')
|
|
|
+ ->select()
|
|
|
+ );
|
|
|
+
|
|
|
+ foreach ($list as $k => $row) {
|
|
|
+ $machine = trim((string)($row['设备编号'] ?? ''));
|
|
|
+ $list[$k]['通电工时_全部'] = isset($allHoursMap[$machine])
|
|
|
+ ? round(floatval($allHoursMap[$machine]), 2)
|
|
|
+ : 0;
|
|
|
+ $list[$k]['通电工时_成本'] = isset($costHoursMap[$machine])
|
|
|
+ ? round(floatval($costHoursMap[$machine]), 2)
|
|
|
+ : 0;
|
|
|
+ $list[$k]['科目名称'] = $search;
|
|
|
+ unset($list[$k]['科目金额']);
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->success('成功', $list ?: []);
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 其他待摊费用
|
|
|
@@ -926,34 +1073,50 @@ class CostAccounting extends Api
|
|
|
if (empty($param)) {
|
|
|
$this->error('参数错误');
|
|
|
}
|
|
|
- $month = substr($param['month'], 0, 4) . '-' . substr($param['month'], 4, 2);
|
|
|
- $field = [
|
|
|
- 'a.jjcp_gdbh as 工单编号',
|
|
|
- 'sum(b.车间人工) as 车间人工',
|
|
|
- 'sum(b.部门人工附加) as 部门人工附加',
|
|
|
- 'sum(c.金额) as 直接材料',
|
|
|
- 'sum(b.分摊材料) as 分摊材料',
|
|
|
- 'sum(b.直接水电) as 直接水电',
|
|
|
- 'sum(b.分摊水电) as 分摊水电',
|
|
|
- 'sum(b.废气处理) as 废气处理',
|
|
|
- 'sum(b.锅炉 + b.热水锅炉) as 锅炉',
|
|
|
- 'sum(b.空压机) as 空压机',
|
|
|
- 'sum(b.真空鼓风机) as 真空鼓风机',
|
|
|
- 'sum(b.中央空调) as 中央空调',
|
|
|
- 'sum(b.分摊其他) as 分摊其他'
|
|
|
- ];
|
|
|
+ $sysNy = trim((string)$param['month']);
|
|
|
+ if (!preg_match('/^\d{6}$/', $sysNy)) {
|
|
|
+ $this->error('月份参数错误,格式应为 YYYYMM');
|
|
|
+ }
|
|
|
+ $warehousingMonth = substr($sysNy, 0, 4) . '-' . substr($sysNy, 4, 2);
|
|
|
|
|
|
- $list = db('成品入仓')
|
|
|
- ->alias('a')
|
|
|
- ->join('成本v23_月度成本明细 b', 'a.jjcp_gdbh = b.sczl_gdbh')
|
|
|
- ->join('材料出库单列表 c', 'a.jjcp_gdbh = c.表体生产订单号', 'left')
|
|
|
- ->field($field)
|
|
|
- ->where('a.jjcp_sj', 'like', $month.'%')
|
|
|
- ->group('a.jjcp_gdbh')
|
|
|
+ // 当月有成品入仓的工单(去重,避免与成本明细关联时重复累加)
|
|
|
+ $gdbhList = db('成品入仓')
|
|
|
+ ->where('jjcp_sj', 'like', $warehousingMonth . '%')
|
|
|
+ ->group('jjcp_gdbh')
|
|
|
+ ->column('jjcp_gdbh');
|
|
|
+
|
|
|
+ if (empty($gdbhList)) {
|
|
|
+ $this->error('未找到完工工单');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 直接材料等取自已核算的月度成本明细,不再关联材料出库单(避免笛卡尔积放大金额)
|
|
|
+ $list = db('成本v23_月度成本明细')
|
|
|
+ ->where('sys_ny', $sysNy)
|
|
|
+ ->where('sczl_gdbh', 'in', $gdbhList)
|
|
|
+ ->field([
|
|
|
+ 'sczl_gdbh as 工单编号',
|
|
|
+ 'sum(车间人工) as 车间人工',
|
|
|
+ 'sum(部门人工附加) as 部门人工附加',
|
|
|
+ 'sum(直接材料) as 直接材料',
|
|
|
+ 'sum(考核直接材料) as 考核直接材料',
|
|
|
+ 'sum(分摊材料) as 分摊材料',
|
|
|
+ 'sum(直接水电) as 直接水电',
|
|
|
+ 'sum(分摊水电) as 分摊水电',
|
|
|
+ 'sum(废气处理) as 废气处理',
|
|
|
+ 'sum(锅炉 + 热水锅炉) as 锅炉',
|
|
|
+ 'sum(空压机) as 空压机',
|
|
|
+ 'sum(真空鼓风机) as 真空鼓风机',
|
|
|
+ 'sum(中央空调) as 中央空调',
|
|
|
+ 'sum(分摊其他) as 分摊其他',
|
|
|
+ 'sum(分摊折旧) as 分摊折旧',
|
|
|
+ 'sum(场地租金) as 场地租金',
|
|
|
+ 'sum(直接折旧) as 直接折旧',
|
|
|
+ ])
|
|
|
+ ->group('sczl_gdbh')
|
|
|
->select();
|
|
|
-
|
|
|
+
|
|
|
if (empty($list)) {
|
|
|
- $this->error('未找到完工工单');
|
|
|
+ $this->error('未找到该月成本明细,请先执行月度成本计算');
|
|
|
}
|
|
|
|
|
|
// 获取所有工单编号
|
|
|
@@ -965,10 +1128,28 @@ class CostAccounting extends Api
|
|
|
->delete();
|
|
|
|
|
|
foreach ($list as $k => $v) {
|
|
|
- $list[$k]['考核直接材料'] = $v['直接材料'];
|
|
|
- $list[$k]['成本合计'] = $v['直接材料'] + $v['车间人工'] + $v['部门人工附加'] + $v['分摊材料'] + $v['直接水电'] + $v['分摊水电'] + $v['废气处理'] +
|
|
|
- $v['锅炉'] + $v['空压机'] + $v['真空鼓风机'] + $v['中央空调'] + $v['分摊其他'];
|
|
|
- $list[$k]['Sys_id'] = $param['sys_id'];
|
|
|
+ $directMaterial = floatval($v['直接材料']);
|
|
|
+ $assessedMaterial = floatval($v['考核直接材料'] ?? 0);
|
|
|
+ if ($assessedMaterial <= 0) {
|
|
|
+ $assessedMaterial = $directMaterial;
|
|
|
+ }
|
|
|
+ $list[$k]['考核直接材料'] = $assessedMaterial;
|
|
|
+ $list[$k]['成本合计'] = $directMaterial
|
|
|
+ + floatval($v['车间人工'])
|
|
|
+ + floatval($v['部门人工附加'])
|
|
|
+ + floatval($v['分摊材料'])
|
|
|
+ + floatval($v['直接水电'])
|
|
|
+ + floatval($v['分摊水电'])
|
|
|
+ + floatval($v['废气处理'])
|
|
|
+ + floatval($v['锅炉'])
|
|
|
+ + floatval($v['空压机'])
|
|
|
+ + floatval($v['真空鼓风机'])
|
|
|
+ + floatval($v['中央空调'])
|
|
|
+ + floatval($v['分摊其他'])
|
|
|
+ + floatval($v['分摊折旧'] ?? 0)
|
|
|
+ + floatval($v['场地租金'] ?? 0)
|
|
|
+ + floatval($v['直接折旧'] ?? 0);
|
|
|
+ $list[$k]['Sys_id'] = $param['sys_id'] ?? '';
|
|
|
$list[$k]['Sys_rq'] = date('Y-m-d H:i:s', time());
|
|
|
}
|
|
|
|
|
|
@@ -1072,34 +1253,6 @@ class CostAccounting extends Api
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
-// public function GetCompletionWorkOrderCostTab()
|
|
|
-// {
|
|
|
-// if ($this->request->isGet() === false) {
|
|
|
-// $this->error('请求错误');
|
|
|
-// }
|
|
|
-// $list = db('成本v23_完工工单车间成本汇总')
|
|
|
-// ->alias('a')
|
|
|
-// ->join('工单_基本资料 b', 'a.工单编号 = b.Gd_gdbh')
|
|
|
-// ->join('产品_基本资料 c', 'b.成品代号 = c.产品编号')
|
|
|
-// ->where('b.成品代号', '<>', '')
|
|
|
-// ->where('c.客户编号', '<>', '')
|
|
|
-// ->where('c.客户名称', '<>', '')
|
|
|
-// ->field([
|
|
|
-// 'TRIM(c.客户名称) as 客户名称',
|
|
|
-// 'TRIM(c.客户编号) as 客户编号'
|
|
|
-// ])
|
|
|
-// ->group('客户编号, 客户名称')
|
|
|
-// ->order('客户编号')
|
|
|
-// ->select();
|
|
|
-// if (empty($list)) {
|
|
|
-// $this->error('未找到完工数据');
|
|
|
-// }
|
|
|
-// $data = [];
|
|
|
-// foreach ($list as $k => $v) {
|
|
|
-// $data[] = $v['客户编号'] .'-->'.$v['客户名称'];
|
|
|
-// }
|
|
|
-// $this->success('成功', $data);
|
|
|
-// }
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -1151,7 +1304,8 @@ class CostAccounting extends Api
|
|
|
$totalQuery = db('成本v23_完工工单车间成本汇总')
|
|
|
->alias('a')
|
|
|
->join('工单_基本资料 b', 'a.工单编号 = b.Gd_gdbh')
|
|
|
- ->where($where);
|
|
|
+ ->where($where)
|
|
|
+ ->group('a.工单编号');
|
|
|
|
|
|
$total = $totalQuery->count();
|
|
|
|
|
|
@@ -1167,11 +1321,15 @@ class CostAccounting extends Api
|
|
|
'a.*',
|
|
|
'TRIM(b.成品代号) as 成品代号',
|
|
|
'TRIM(b.成品名称) as 成品名称',
|
|
|
+ 'TRIM(b.接单日期) as 开单日期',
|
|
|
])
|
|
|
->where($where)
|
|
|
+ ->group('a.工单编号')
|
|
|
->order('a.工单编号 DESC')
|
|
|
->limit($offset, $pageSize)
|
|
|
->select();
|
|
|
+
|
|
|
+ $list = $this->enrichCompletionWorkOrderCostList($list);
|
|
|
}
|
|
|
if (empty($list)) {
|
|
|
$this->error('未找到完工成本数据');
|
|
|
@@ -1183,74 +1341,109 @@ class CostAccounting extends Api
|
|
|
$this->success('成功', $data);
|
|
|
}
|
|
|
|
|
|
-// public function CompletionWorkOrderCostList()
|
|
|
-// {
|
|
|
-// if ($this->request->isGet() === false) {
|
|
|
-// $this->error('请求错误');
|
|
|
-// }
|
|
|
-// $param = $this->request->param();
|
|
|
-// if (empty($param)) {
|
|
|
-// $this->error('参数错误');
|
|
|
-// }
|
|
|
-//
|
|
|
-//// 参数过滤和安全处理
|
|
|
-// $param = array_map(function($value) {
|
|
|
-// return is_string($value) ? trim($value) : $value;
|
|
|
-// }, $param);
|
|
|
-//
|
|
|
-// $where = [];
|
|
|
-//
|
|
|
-//// 精确查询成品代号
|
|
|
-// if (!empty($param['code'])) {
|
|
|
-// $code = htmlspecialchars($param['code'], ENT_QUOTES);
|
|
|
-// $where['b.成品代号'] = ['like', $code . '%'];
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 分页参数处理
|
|
|
-// $page = max(1, intval($param['page'] ?? 1));
|
|
|
-// $pageSize = max(1, min(100, intval($param['limit'] ?? 30))); // 限制最大100条
|
|
|
-//
|
|
|
-// // 搜索条件处理
|
|
|
-// if (!empty($param['search'])) {
|
|
|
-// $search = htmlspecialchars($param['search'], ENT_QUOTES);
|
|
|
-// $where['a.工单编号|b.成品名称'] = ['like', $search . '%'];
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 获取总数用于分页(性能优化)
|
|
|
-// $totalQuery = db('成本v23_完工工单车间成本汇总')
|
|
|
-// ->alias('a')
|
|
|
-// ->join('工单_基本资料 b', 'a.工单编号 = b.Gd_gdbh')
|
|
|
-// ->where($where);
|
|
|
-//
|
|
|
-// $total = $totalQuery->count();
|
|
|
-//
|
|
|
-// // 分页查询数据
|
|
|
-// $list = [];
|
|
|
-// if ($total > 0) {
|
|
|
-// $offset = ($page - 1) * $pageSize;
|
|
|
-//
|
|
|
-// $list = db('成本v23_完工工单车间成本汇总')
|
|
|
-// ->alias('a')
|
|
|
-// ->join('工单_基本资料 b', 'a.工单编号 = b.Gd_gdbh')
|
|
|
-// ->field([
|
|
|
-// 'a.*',
|
|
|
-// 'TRIM(b.成品代号) as 成品代号',
|
|
|
-// 'TRIM(b.成品名称) as 成品名称',
|
|
|
-// ])
|
|
|
-// ->where($where)
|
|
|
-// ->order('a.工单编号 DESC') // 添加排序,避免分页混乱
|
|
|
-// ->limit($offset, $pageSize)
|
|
|
-// ->select();
|
|
|
-// }
|
|
|
-// if (empty($list)) {
|
|
|
-// $this->error('未找到完工成本数据');
|
|
|
-// }
|
|
|
-// $data = [
|
|
|
-// 'total' => $total,
|
|
|
-// 'list' => $list,
|
|
|
-// ];
|
|
|
-// $this->success('成功', $data);
|
|
|
-// }
|
|
|
+ /**
|
|
|
+ * 完工工单成本列表:补充合格率、入仓数量、日期、单位成本
|
|
|
+ *
|
|
|
+ * @param array $list
|
|
|
+ * @return array
|
|
|
+ */
|
|
|
+ private function enrichCompletionWorkOrderCostList(array $list): array
|
|
|
+ {
|
|
|
+ if (empty($list)) {
|
|
|
+ return $list;
|
|
|
+ }
|
|
|
+
|
|
|
+ $gdbhList = array_values(array_unique(array_filter(array_map(function ($row) {
|
|
|
+ return isset($row['工单编号']) ? trim((string)$row['工单编号']) : '';
|
|
|
+ }, $list))));
|
|
|
+
|
|
|
+ if (empty($gdbhList)) {
|
|
|
+ return $list;
|
|
|
+ }
|
|
|
+
|
|
|
+ $warehousingRows = db('成品入仓')
|
|
|
+ ->field('jjcp_gdbh, jjcp_yjno, SUM(jjcp_sl) AS sl')
|
|
|
+ ->where('jjcp_gdbh', 'in', $gdbhList)
|
|
|
+ ->group('jjcp_gdbh, jjcp_yjno')
|
|
|
+ ->select();
|
|
|
+
|
|
|
+ $warehousingByOrder = [];
|
|
|
+ foreach ($warehousingRows as $row) {
|
|
|
+ $gdbh = trim((string)$row['jjcp_gdbh']);
|
|
|
+ $sl = floatval($row['sl']);
|
|
|
+ if (!isset($warehousingByOrder[$gdbh])) {
|
|
|
+ $warehousingByOrder[$gdbh] = 0;
|
|
|
+ }
|
|
|
+ $warehousingByOrder[$gdbh] += $sl;
|
|
|
+ }
|
|
|
+
|
|
|
+ $lastWarehousingRows = db('成品入仓')
|
|
|
+ ->field('jjcp_gdbh, MAX(jjcp_sj) AS last_sj')
|
|
|
+ ->where('jjcp_gdbh', 'in', $gdbhList)
|
|
|
+ ->where('jjcp_smb', 'like', '末%')
|
|
|
+ ->group('jjcp_gdbh')
|
|
|
+ ->select();
|
|
|
+
|
|
|
+ $lastWarehousingMap = [];
|
|
|
+ foreach ($lastWarehousingRows as $row) {
|
|
|
+ $gdbh = trim((string)$row['jjcp_gdbh']);
|
|
|
+ $ts = !empty($row['last_sj']) ? strtotime($row['last_sj']) : false;
|
|
|
+ $lastWarehousingMap[$gdbh] = $ts ? date('Y-m-d', $ts) : null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $materialRows = db('工单_质量考核汇总')
|
|
|
+ ->field('Gy0_gdbh, 印件及工序, MAX(实际投料) AS 实际投料')
|
|
|
+ ->where('Gy0_gdbh', 'in', $gdbhList)
|
|
|
+ ->group('Gy0_gdbh, 印件及工序')
|
|
|
+ ->select();
|
|
|
+
|
|
|
+ $actualMaterialByOrder = [];
|
|
|
+ foreach ($materialRows as $row) {
|
|
|
+ $gdbh = trim((string)$row['Gy0_gdbh']);
|
|
|
+ $mat = floatval($row['实际投料']);
|
|
|
+ if ($mat <= 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!isset($actualMaterialByOrder[$gdbh])) {
|
|
|
+ $actualMaterialByOrder[$gdbh] = 0;
|
|
|
+ }
|
|
|
+ $actualMaterialByOrder[$gdbh] += $mat * 10000;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach ($list as $key => $item) {
|
|
|
+ $gdbh = isset($item['工单编号']) ? trim((string)$item['工单编号']) : '';
|
|
|
+
|
|
|
+ if (!empty($item['开单日期'])) {
|
|
|
+ $orderDateTs = strtotime($item['开单日期']);
|
|
|
+ $list[$key]['开单日期'] = $orderDateTs ? date('Y-m-d', $orderDateTs) : trim((string)$item['开单日期']);
|
|
|
+ } else {
|
|
|
+ $list[$key]['开单日期'] = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $whQty = $warehousingByOrder[$gdbh] ?? 0;
|
|
|
+ $list[$key]['成品入仓数量'] = round($whQty, 2);
|
|
|
+
|
|
|
+ $list[$key]['入仓日期'] = $lastWarehousingMap[$gdbh] ?? null;
|
|
|
+
|
|
|
+ $denominator = $actualMaterialByOrder[$gdbh] ?? 0;
|
|
|
+ if ($denominator > 0 && $whQty > 0) {
|
|
|
+ $rate = $whQty / $denominator * 100;
|
|
|
+ $list[$key]['工单合格率'] = number_format($rate, 2) . '%';
|
|
|
+ } else {
|
|
|
+ $list[$key]['工单合格率'] = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ $totalCost = floatval($item['成本合计'] ?? 0);
|
|
|
+ if ($whQty > 0) {
|
|
|
+ $list[$key]['单位成本'] = round($totalCost / $whQty, 4);
|
|
|
+ } else {
|
|
|
+ $list[$key]['单位成本'] = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $list;
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
@@ -1348,4 +1541,43 @@ class CostAccounting extends Api
|
|
|
$this->success('成功', $result);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 完工工单工序成本明细(按工单编号查成本v23_月度成本明细)
|
|
|
+ */
|
|
|
+ public function getCompletionWorkOrderCostDetailList()
|
|
|
+ {
|
|
|
+ if (!$this->request->isGet()) {
|
|
|
+ $this->error('请求错误');
|
|
|
+ }
|
|
|
+
|
|
|
+ $param = $this->request->param();
|
|
|
+ $gdbh = trim((string)($param['gdbh'] ?? $param['工单编号'] ?? $param['order'] ?? ''));
|
|
|
+ if ($gdbh === '') {
|
|
|
+ $this->error('缺少必要参数:工单编号');
|
|
|
+ }
|
|
|
+
|
|
|
+ $query = db('成本v23_月度成本明细')->where('sczl_gdbh', $gdbh);
|
|
|
+
|
|
|
+ $sysNy = trim((string)($param['sys_ny'] ?? $param['month'] ?? ''));
|
|
|
+ if ($sysNy !== '' && preg_match('/^\d{6}$/', $sysNy)) {
|
|
|
+ $query->where('sys_ny', $sysNy);
|
|
|
+ } elseif (!empty($param['year']) && !empty($param['month'])) {
|
|
|
+ $sysNy = $param['year'] . str_pad((string)$param['month'], 2, '0', STR_PAD_LEFT);
|
|
|
+ $query->where('sys_ny', $sysNy);
|
|
|
+ }
|
|
|
+
|
|
|
+ $list = $query
|
|
|
+ ->order('sys_ny desc, sczl_yjno asc, sczl_gxh asc, sczl_jtbh asc')
|
|
|
+ ->select();
|
|
|
+
|
|
|
+ if (empty($list)) {
|
|
|
+ $this->error('未找到该工单工序成本明细');
|
|
|
+ }
|
|
|
+
|
|
|
+ $this->success('成功', [
|
|
|
+ 'total' => count($list),
|
|
|
+ 'list' => $list,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
}
|