成本归集添加下料成本

This commit is contained in:
z 2026-01-21 08:59:47 +08:00
parent e79578c238
commit fb8af209a8
18 changed files with 678 additions and 35 deletions

View File

@ -205,11 +205,12 @@ public class ProjectOrderController {
//材料成本
BigDecimal materialCost;
materialCost=processBomService.materialCost(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setCailiaoCost(materialCost);
//内部工时费
BigDecimal internalLaborCost;
internalLaborCost=processBomService.internalLaborCost(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setNeibuCost(internalLaborCost);
projectOrderDO.setCailiaoCost(materialCost.add(outsourcedProcessingFee).add(internalLaborCost));
//装配工时费
BigDecimal assemblyLaborCost;
assemblyLaborCost=processBomService.assemblyLaborCost(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
@ -220,7 +221,7 @@ public class ProjectOrderController {
yunFeiCost = deliverOrderService.getListYf(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setYunFeiCost(yunFeiCost);
BigDecimal sum = projectOrderDO.getYunFeiCost().add(projectOrderDO.getCailiaoCost()).add(projectOrderDO.getBiaoZhunJianCost()).add(projectOrderDO.getZpCost());
BigDecimal sum = projectOrderDO.getYunFeiCost().add(projectOrderDO.getCailiaoCost()).add(projectOrderDO.getBiaoZhunJianCost()).add(projectOrderDO.getZpCost().add(projectOrderDO.getNeibuCost()).add(projectOrderDO.getWaixeiCost()));
projectOrderDO.setSumCost(sum);
}
return success(BeanUtils.toBean(pageResult, ProjectOrderCostRespVO.class));

View File

@ -274,12 +274,26 @@ public class TaskDispatchController {
return success( list);
}
@GetMapping("/getListCl")
@Operation(summary = "获得材料成本")
@Operation(summary = "获得外部材料成本")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:query')")
public CommonResult<List<TaskDispatchDO>> getListCl(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
List<TaskDispatchDO> list= taskDispatchService.getListCl(id,projectSubId);
return success( list);
}
@GetMapping("/getListNg")
@Operation(summary = "获得内部工时费")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:query')")
public CommonResult<List<TaskDispatchDO>> getListNg(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
List<TaskDispatchDO> list= taskDispatchService.getListNg(id,projectSubId);
return success( list);
}
@GetMapping("/getListNc")
@Operation(summary = "获得内部材料成本")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:query')")
public CommonResult<List<TaskDispatchDO>> getListNc(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
List<TaskDispatchDO> list= taskDispatchService.getListNc(id,projectSubId);
return success( list);
}
@GetMapping("/taskBbPage")
@Operation(summary = "获得外协零件分页")
@PreAuthorize("@ss.hasPermission('heli:task-dispatch:query')")

View File

@ -221,4 +221,6 @@ public interface ProcessBomMapper extends BaseMapperX<ProcessBomDO> {
BigDecimal outsourcingExpenses(@Param("id") Long id,@Param("projectSubId") Long projectSubId);
@Delete("delete from pro_process_bom where project_id=#{id}")
void deleteOrderId(@Param("id") Long id);
BigDecimal cuttingMaterials(@Param("id") Long id, @Param("projectSubId")Long projectSubId);
}

View File

@ -1037,4 +1037,15 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
query.eq(TaskDispatchDetailDO::getId,reqVO.getId());
return selectOne(query);
}
default List<TaskDispatchDetailDO> getTaskDispatchDetails(List<Long> dispatchIds){
MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(TaskDispatchDetailDO.class)
.leftJoin(ProcedureDO.class,"p", ProcedureDO::getId, TaskDispatchDetailDO::getProcedureId);
query.in(TaskDispatchDetailDO::getDispatchId, dispatchIds)
.in(ProcedureDO::getName,"下料1","下料2");
return selectList(query);
}
List<BubbleFeeResult> cuttingMaterialsBatch(@Param("bomDetailIds")List<Long> bomDetailIds);
}

View File

@ -239,4 +239,5 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
return selectList(query);
}
}

View File

@ -1616,13 +1616,13 @@ public class ProcessBomServiceImpl implements ProcessBomService {
// .map(purchaseOrderMakeDetailDO -> purchaseOrderMakeDetailDO.getFoamPrice() != null ? purchaseOrderMakeDetailDO.getFoamPrice() : BigDecimal.ZERO)
// .reduce(BigDecimal.ZERO, BigDecimal::add);
// }
BigDecimal cost= processBomMapper.bubbleFees(id,projectSubId);
BigDecimal cost1=processBomMapper.inspection(id,projectSubId);
if (ObjectUtil.isEmpty(cost1)) cost1=BigDecimal.ZERO;
// BigDecimal cost= processBomMapper.bubbleFees(id,projectSubId);
//
// BigDecimal cost1=processBomMapper.inspection(id,projectSubId);
BigDecimal cost= processBomMapper.cuttingMaterials(id,projectSubId);
if (ObjectUtil.isEmpty(cost)) cost=BigDecimal.ZERO;
return cost.add(cost1);
return cost;
}
@Override

View File

@ -243,6 +243,7 @@ public class PurchaseOrderNoDetailServiceImpl implements PurchaseOrderNoDetailSe
// //出库库物料集合
// ArrayList<StorageMatDO> outList = new ArrayList<>();
ArrayList<StorageLogDO> logList = new ArrayList<>();
// ArrayList<StorageLogDO> outLogList = new ArrayList<>();
//生成入库单
StorageInDO storageInDO = new StorageInDO();
@ -297,6 +298,7 @@ public class PurchaseOrderNoDetailServiceImpl implements PurchaseOrderNoDetailSe
// outMat.setProjectSubName(byId.getName());
ProcessBomDetailDO bomDetailDO = processBomDetailMapper.selectById(detailDO.getBoomDetailId());
StorageLogDO logDO = new StorageLogDO();
// StorageLogDO outLogDO = new StorageLogDO();
if (ObjectUtil.isNotEmpty(bomDetailDO)){
String bomCode="";
String blueprintNo="";
@ -335,10 +337,12 @@ public class PurchaseOrderNoDetailServiceImpl implements PurchaseOrderNoDetailSe
// storageMatDO.setMatId(materialDO.getId());
// outMat.setMatId(materialDO.getId());
logDO.setMatId(materialDO.getId());
// outLogDO.setMatId(materialDO.getId());
}else {
// storageMatDO.setMatId(material.getId());
// outMat.setMatId(material.getId());
logDO.setMatId(material.getId());
// outLogDO.setMatId(material.getId());
}
}
// storageMatDOS.add(storageMatDO);
@ -401,9 +405,14 @@ public class PurchaseOrderNoDetailServiceImpl implements PurchaseOrderNoDetailSe
logDO.setGoodsType(2);
logDO.setCodeNo(storageInDO.getStorageNo());
logList.add(logDO);
// outLogDO.setStockMode(25);
// outLogDO.setStockType(2);
// outLogDO.setGoodsType(2);
// outLogList.add(outLogDO);
}
}
storageLogMapper.insertBatch(logList);
// storageLogMapper.insertBatch(outLogList);
// storageMatMapper.insertBatch(storageMatDOS);
// storageMatMapper.insertBatch(outList);
// storageService.updateMatLogList(storageDO.getId(),2);

View File

@ -121,4 +121,8 @@ public interface TaskDispatchService {
CommonResult<Boolean> verification(TaskDispatchDetailPageReqVO pageReqVO);
CommonResult<Boolean> productionCompleted(TaskDispatchDetailPageReqVO pageReqVO);
List<TaskDispatchDO> getListNg(Long id, Long projectSubId);
List<TaskDispatchDO> getListNc(Long id, Long projectSubId);
}

View File

@ -1351,8 +1351,8 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
//
// return taskDispatchDOS;
List<TaskDispatchDO> taskDispatchDOS = taskDispatchMapper.getListCl(id, projectSubId);
if (taskDispatchDOS.isEmpty()) {
List<TaskDispatchDO> list = new ArrayList<>();
if (ObjectUtil.isEmpty(taskDispatchDOS)) {
return taskDispatchDOS;
}
@ -1363,6 +1363,9 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
// 2. 批量查询所有TaskDispatchDetailDO
List<TaskDispatchDetailDO> allDetailDOS = getTaskDispatchDetailsBatch(dispatchIds);
if (ObjectUtil.isEmpty(allDetailDOS)){
return taskDispatchDOS;
}
Map<Long, List<TaskDispatchDetailDO>> detailsByDispatchId = allDetailDOS.stream()
.collect(Collectors.groupingBy(TaskDispatchDetailDO::getDispatchId));
@ -1376,10 +1379,10 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
Map<Long, ProcedureDO> procedureMap = getProceduresBatch(procedureIds);
// 5. 批量查询各种成本数据
Map<CostQueryKey, BigDecimal> bubbleFeesMap = getBubbleFeesBatch(allDetailDOS, taskDispatchDOS);
// Map<CostQueryKey, BigDecimal> bubbleFeesMap = getBubbleFeesBatch(allDetailDOS, taskDispatchDOS);
Map<CostQueryKey, BigDecimal> materialCostsMap = getMaterialCostsBatch(allDetailDOS, taskDispatchDOS);
Map<Long, BigDecimal> internalLaborCostMap = getInternalLaborCostBatch(allDetailDOS);
Map<Long, BigDecimal> processInspectionMap = getProcessInspectionBatch(allDetailDOS);
// Map<Long, BigDecimal> internalLaborCostMap = getInternalLaborCostBatch(allDetailDOS);
// Map<Long, BigDecimal> processInspectionMap = getProcessInspectionBatch(allDetailDOS);
// 6. 处理计算结果
for (TaskDispatchDO taskDispatchDO : taskDispatchDOS) {
@ -1392,16 +1395,16 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
if (procedureDO == null) continue;
// 从批量查询的结果中获取数据
BigDecimal procedureCost = getCostValue(bubbleFeesMap,
new CostQueryKey(taskDispatchDO.getBomDetailId(), detailDO.getProcedureId()));
// BigDecimal procedureCost = getCostValue(bubbleFeesMap,
// new CostQueryKey(taskDispatchDO.getBomDetailId(), detailDO.getProcedureId()));
BigDecimal materialCost = getCostValue(materialCostsMap,
new CostQueryKey(taskDispatchDO.getBomDetailId(), detailDO.getProcedureId()));
BigDecimal internalLaborCost = getCostValue(internalLaborCostMap, detailDO.getId());
BigDecimal processInspection = getCostValue(processInspectionMap, detailDO.getId());
// BigDecimal internalLaborCost = getCostValue(internalLaborCostMap, detailDO.getId());
// BigDecimal processInspection = getCostValue(processInspectionMap, detailDO.getId());
BigDecimal sum = procedureCost.add(materialCost).add(internalLaborCost).add(processInspection);
costMap.put(procedureDO.getName(), sum);
assemblyLaborCost = assemblyLaborCost.add(sum);
// BigDecimal sum = procedureCost.add(materialCost).add(internalLaborCost).add(processInspection);
costMap.put(procedureDO.getName(), materialCost);
assemblyLaborCost = assemblyLaborCost.add(materialCost);
}
taskDispatchDO.setAssemblyLaborSum(assemblyLaborCost);
@ -1411,9 +1414,12 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
} else {
taskDispatchDO.setAssemblyLaborCost(BigDecimal.ZERO);
}
if (assemblyLaborCost.compareTo(BigDecimal.ZERO) > 0){
list.add(taskDispatchDO);
}
}
return taskDispatchDOS;
return list;
}
private Map<Long, ProcedureDO> getProceduresBatch(Set<Long> procedureIds){
@ -1429,8 +1435,10 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
wrapper.in(TaskDispatchDetailDO::getDispatchId, dispatchIds);
return taskDispatchDetailMapper.selectList(wrapper);
}
// 批量成本查询方法
private List<TaskDispatchDetailDO> getTaskDispatchDetails(List<Long> dispatchIds) {
return taskDispatchDetailMapper.getTaskDispatchDetails(dispatchIds);
}
// 批量成本查询方法
private Map<CostQueryKey, BigDecimal> getBubbleFeesBatch(List<TaskDispatchDetailDO> details, List<TaskDispatchDO> dispatches) {
// 1. 收集所有需要查询的键
Set<CostQueryKey> queryKeys = collectBubbleFeeQueryKeys(details, dispatches);
@ -1550,7 +1558,18 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
List<BubbleFeeResult> batchResults=taskDispatchDetailMapper.batchProcessInspection(bomDetailIds);
return convertToMap(batchResults);
}
private Map<Long, BigDecimal> getCuttingMaterialsBatch(List<TaskDispatchDetailDO> details) {
if (details.isEmpty()) {
return Collections.emptyMap();
}
// 提取bomDetailIds和procedureIds
List<Long> bomDetailIds = details.stream()
.map(TaskDispatchDetailDO::getId)
.distinct()
.collect(Collectors.toList());
List<BubbleFeeResult> batchResults=taskDispatchDetailMapper.cuttingMaterialsBatch(bomDetailIds);
return convertToMap(batchResults);
}
// 辅助方法
private BigDecimal getCostValue(Map<?, BigDecimal> costMap, Object key) {
if (costMap == null || costMap.isEmpty()) {
@ -1641,6 +1660,147 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
return CommonResult.success( true);
}
@Override
public List<TaskDispatchDO> getListNg(Long id, Long projectSubId) {
List<TaskDispatchDO> taskDispatchDOS = taskDispatchMapper.getListCl(id, projectSubId);
List<TaskDispatchDO> list = new ArrayList<>();
if (taskDispatchDOS.isEmpty()) {
return taskDispatchDOS;
}
// 1. 批量获取所有dispatchId
List<Long> dispatchIds = taskDispatchDOS.stream()
.map(TaskDispatchDO::getId)
.collect(Collectors.toList());
// 2. 批量查询所有TaskDispatchDetailDO
List<TaskDispatchDetailDO> allDetailDOS = getTaskDispatchDetailsBatch(dispatchIds);
Map<Long, List<TaskDispatchDetailDO>> detailsByDispatchId = allDetailDOS.stream()
.collect(Collectors.groupingBy(TaskDispatchDetailDO::getDispatchId));
// 3. 批量获取所有procedureId
Set<Long> procedureIds = allDetailDOS.stream()
.map(TaskDispatchDetailDO::getProcedureId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 4. 批量查询ProcedureDO
Map<Long, ProcedureDO> procedureMap = getProceduresBatch(procedureIds);
// 5. 批量查询各种成本数据
// Map<CostQueryKey, BigDecimal> bubbleFeesMap = getBubbleFeesBatch(allDetailDOS, taskDispatchDOS);
// Map<CostQueryKey, BigDecimal> materialCostsMap = getMaterialCostsBatch(allDetailDOS, taskDispatchDOS);
Map<Long, BigDecimal> internalLaborCostMap = getInternalLaborCostBatch(allDetailDOS);
Map<Long, BigDecimal> processInspectionMap = getProcessInspectionBatch(allDetailDOS);
// 6. 处理计算结果
for (TaskDispatchDO taskDispatchDO : taskDispatchDOS) {
List<TaskDispatchDetailDO> detailDOS = detailsByDispatchId.getOrDefault(taskDispatchDO.getId(), Collections.emptyList());
Map<String, BigDecimal> costMap = new HashMap<>();
BigDecimal assemblyLaborCost = BigDecimal.ZERO;
for (TaskDispatchDetailDO detailDO : detailDOS) {
ProcedureDO procedureDO = procedureMap.get(detailDO.getProcedureId());
if (procedureDO == null) continue;
// 从批量查询的结果中获取数据
// BigDecimal procedureCost = getCostValue(bubbleFeesMap,
// new CostQueryKey(taskDispatchDO.getBomDetailId(), detailDO.getProcedureId()));
// BigDecimal materialCost = getCostValue(materialCostsMap,
// new CostQueryKey(taskDispatchDO.getBomDetailId(), detailDO.getProcedureId()));
BigDecimal internalLaborCost = getCostValue(internalLaborCostMap, detailDO.getId());
BigDecimal processInspection = getCostValue(processInspectionMap, detailDO.getId());
BigDecimal sum = internalLaborCost.add(processInspection);
costMap.put(procedureDO.getName(), sum);
assemblyLaborCost = assemblyLaborCost.add(sum);
}
taskDispatchDO.setAssemblyLaborSum(assemblyLaborCost);
taskDispatchDO.setMap(costMap);
if (taskDispatchDO.getAmount() != null && taskDispatchDO.getAmount().compareTo(BigDecimal.ZERO) != 0) {
taskDispatchDO.setAssemblyLaborCost(assemblyLaborCost.divide(taskDispatchDO.getAmount(), 1, RoundingMode.HALF_UP));
} else {
taskDispatchDO.setAssemblyLaborCost(BigDecimal.ZERO);
}
if (assemblyLaborCost.compareTo(BigDecimal.ZERO) > 0){
list.add(taskDispatchDO);
}
}
return list;
}
@Override
public List<TaskDispatchDO> getListNc(Long id, Long projectSubId) {
List<TaskDispatchDO> taskDispatchDOS = taskDispatchMapper.getListCl(id, projectSubId);
List<TaskDispatchDO> list = new ArrayList<>();
if (taskDispatchDOS.isEmpty()) {
return taskDispatchDOS;
}
// 1. 批量获取所有dispatchId
List<Long> dispatchIds = taskDispatchDOS.stream()
.map(TaskDispatchDO::getId)
.collect(Collectors.toList());
// 2. 批量查询所有TaskDispatchDetailDO
List<TaskDispatchDetailDO> allDetailDOS = getTaskDispatchDetails(dispatchIds);
Map<Long, List<TaskDispatchDetailDO>> detailsByDispatchId = allDetailDOS.stream()
.collect(Collectors.groupingBy(TaskDispatchDetailDO::getDispatchId));
// 3. 批量获取所有procedureId
Set<Long> procedureIds = allDetailDOS.stream()
.map(TaskDispatchDetailDO::getProcedureId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 4. 批量查询ProcedureDO
Map<Long, ProcedureDO> procedureMap = getProceduresBatch(procedureIds);
// 5. 批量查询各种成本数据
// Map<CostQueryKey, BigDecimal> bubbleFeesMap = getBubbleFeesBatch(allDetailDOS, taskDispatchDOS);
// Map<CostQueryKey, BigDecimal> materialCostsMap = getMaterialCostsBatch(allDetailDOS, taskDispatchDOS);
// Map<Long, BigDecimal> internalLaborCostMap = getInternalLaborCostBatch(allDetailDOS);
// Map<Long, BigDecimal> processInspectionMap = getProcessInspectionBatch(allDetailDOS);
Map<Long, BigDecimal> CuttingMaterialsMap = getCuttingMaterialsBatch(allDetailDOS);
// 6. 处理计算结果
for (TaskDispatchDO taskDispatchDO : taskDispatchDOS) {
List<TaskDispatchDetailDO> detailDOS = detailsByDispatchId.getOrDefault(taskDispatchDO.getId(), Collections.emptyList());
Map<String, BigDecimal> costMap = new HashMap<>();
BigDecimal assemblyLaborCost = BigDecimal.ZERO;
for (TaskDispatchDetailDO detailDO : detailDOS) {
ProcedureDO procedureDO = procedureMap.get(detailDO.getProcedureId());
if (procedureDO == null) continue;
// 从批量查询的结果中获取数据
// BigDecimal procedureCost = getCostValue(bubbleFeesMap,
// new CostQueryKey(taskDispatchDO.getBomDetailId(), detailDO.getProcedureId()));
// BigDecimal materialCost = getCostValue(materialCostsMap,
// new CostQueryKey(taskDispatchDO.getBomDetailId(), detailDO.getProcedureId()));
BigDecimal cuttingMaterialsCost = getCostValue(CuttingMaterialsMap, detailDO.getId());
// BigDecimal processInspection = getCostValue(processInspectionMap, detailDO.getId());
// BigDecimal sum = internalLaborCost.add(processInspection);
costMap.put(procedureDO.getName(), cuttingMaterialsCost);
assemblyLaborCost = assemblyLaborCost.add(cuttingMaterialsCost);
}
taskDispatchDO.setAssemblyLaborSum(assemblyLaborCost);
taskDispatchDO.setMap(costMap);
if (taskDispatchDO.getAmount() != null && taskDispatchDO.getAmount().compareTo(BigDecimal.ZERO) != 0) {
taskDispatchDO.setAssemblyLaborCost(assemblyLaborCost.divide(taskDispatchDO.getAmount(), 1, RoundingMode.HALF_UP));
} else {
taskDispatchDO.setAssemblyLaborCost(BigDecimal.ZERO);
}
if (assemblyLaborCost.compareTo(BigDecimal.ZERO) > 0) {
list.add(taskDispatchDO);
}
}
return list;
}
private void updateAssembleDetail(OperateTypeEnum operateTypeEnum,Long dispatchId, List<TaskDispatchDetailOwnerDO> list) {
list.forEach(o -> o.setDispatchId(dispatchId));

View File

@ -124,6 +124,13 @@
GROUP BY s.id
) AS subquery;
</select>
<select id="cuttingMaterials" resultType="java.math.BigDecimal">
SELECT sum(r.report_price) cost
from pro_task_dispatch t
left join pro_task_dispatch_detail t1 on t.id=t1.dispatch_id and t1.deleted=0 and t1.tenant_id=2
left join pro_task_in_report r on r.dispatch_detail_id=t1.id and r.deleted=0 and r.tenant_id=2
where t.deleted=0 and t.dispatch_type='PRODUCTION' and t.project_id=#{id} and t.project_sub_id= #{projectSubId}
</select>
<update id="updateDetailEditStatusById" parameterType="Long">
UPDATE pro_process_bom_detail

View File

@ -14,7 +14,7 @@
from wms_storage sto
left join wms_storage_mat mat on mat.stock_id=sto.id and mat.deleted=0 and mat.tenant_id=2
left join base_material m on mat.mat_id=m.id and m.deleted=0 and m.tenant_id=2
where sto.stock_in_type=5 and sto.status=4 and sto.project_no=#{projectSubId}
where sto.stock_in_type=5 and sto.status=4 and mat.project_no=#{projectSubId}
</select>
<select id="getList" resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO">

View File

@ -257,4 +257,16 @@
</foreach>
group by g.dispatch_detail_id
</select>
<select id="cuttingMaterialsBatch"
resultType="com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.BubbleFeeResult">
SELECT t1.id as dispatchDetailId,COALESCE(sum(r.report_price),0) cost
from pro_task_dispatch t
left join pro_task_dispatch_detail t1 on t.id=t1.dispatch_id and t1.deleted=0 and t1.tenant_id=2
left join pro_task_in_report r on r.dispatch_detail_id=t1.id and r.deleted=0 and r.tenant_id=2
where t1.is_outsourcing='N' and t.deleted=0 and t.dispatch_type='PRODUCTION' and t1.id in
<foreach collection="bomDetailIds" item="bomDetailId" open="(" close=")" separator=",">
#{bomDetailId}
</foreach>
group by t1.id
</select>
</mapper>

View File

@ -43,10 +43,18 @@ export const getListqt = async (id: number,projectSubId: number) => {
export const getListYfDetails = async (id: number,projectSubId: number) => {
return await request.get({ url: `/heli/deliver-order/getListYfDetails?id=`+id+`&projectSubId=`+projectSubId })
}
//查询材料成本
//查询外部材料成本
export const getListcl = async (id: number,projectSubId: number) => {
return await request.get({ url: `/heli/task-dispatch/getListCl?id=`+id+`&projectSubId=`+projectSubId })
}
//查询内部材料成本
export const getListNc = async (id: number,projectSubId: number) => {
return await request.get({ url: `/heli/task-dispatch/getListNc?id=`+id+`&projectSubId=`+projectSubId })
}
//查询内部工时费
export const getListNg = async (id: number,projectSubId: number) => {
return await request.get({ url: `/heli/task-dispatch/getListNg?id=`+id+`&projectSubId=`+projectSubId })
}
//查询装配成本
export const getListZp = async (id: number,projectSubId: number) => {
return await request.get({ url: `/heli/task-dispatch/getListZp?id=`+id+`&projectSubId=`+projectSubId })

View File

@ -284,7 +284,7 @@ const getSummaries = (param: SummaryMethodProps) => {
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
sums[index] = '';
return;
}
if (!summaryField.includes(column.property)) {

View File

@ -177,7 +177,7 @@ const getSummaries = (param: SummaryMethodProps) => {
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
sums[index] = '';
return;
}
if (!summaryField.includes(column.property)) {

View File

@ -40,10 +40,16 @@
</el-col>
<el-col :span="6">
<el-form-item label="材料成本" prop="caiLiaoCost">
<el-form-item label="内部材料成本" prop="caiLiaoCost">
<el-input class="!w-265px" v-model="formData.caiLiaoCost" disabled />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="外部材料成本" prop="caiLiaoCost">
<el-input class="!w-265px" v-model="formData.waixeiCost" disabled />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="内部加工费" prop="neiBuCost">
<el-input class="!w-265px" v-model="formData.neiBuCost" disabled />
@ -80,7 +86,9 @@
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="标准件成本" name="biao">{{ }}</el-tab-pane>
<el-tab-pane label="材料成本" name="cai">{{ }}</el-tab-pane>
<el-tab-pane label="内部材料成本" name="neicai">{{ }}</el-tab-pane>
<el-tab-pane label="外部材料成本" name="cai">{{ }}</el-tab-pane>
<el-tab-pane label="内部工时费" name="neigong">{{ }}</el-tab-pane>
<el-tab-pane label="装配成本" name="zhuang">{{ }}</el-tab-pane>
<el-tab-pane label="运费成本" name="yun">{{ }}</el-tab-pane>
</el-tabs>
@ -117,6 +125,42 @@
</el-table>
</el-card>
<el-card class="hl-card-info" v-if="activeIndex == 'neicai'">
<!-- <template #header>-->
<!-- <div class="hl-card-info-icona"></div><span class="hl-card-info-text">材料成本</span>-->
<!-- </template>-->
<el-table v-loading="loading" :data="listnc" :stripe="true" :show-overflow-tooltip="true" border class="hl-table" height="500px">
<el-table-column type="index" width="70" fixed label="序号" align="center" />
<el-table-column label="零件名称" align="center" prop="materialName" />
<el-table-column label="材质" align="center" prop="compositionName" />
<el-table-column label="规格型号" align="center" prop="spec" />
<el-table-column label="数量" align="center" prop="amount" />
<el-table-column label="下料1" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['下料1']">
<span >
<span >{{ row.map['下料1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="下料2" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['下料2']">
<span >
<span >{{ row.map['下料2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="单件成本" align="center" prop="assemblyLaborCost" width="120px"/>
</el-table>
</el-card>
<el-card class="hl-card-info" v-if="activeIndex == 'cai'">
<!-- <template #header>-->
<!-- <div class="hl-card-info-icona"></div><span class="hl-card-info-text">材料成本</span>-->
@ -413,7 +457,302 @@
</el-table>
</el-card>
<el-card class="hl-card-info" v-if="activeIndex == 'neigong'">
<!-- <template #header>-->
<!-- <div class="hl-card-info-icona"></div><span class="hl-card-info-text">材料成本</span>-->
<!-- </template>-->
<el-table v-loading="loading" :data="listng" :stripe="true" :show-overflow-tooltip="true" border class="hl-table" height="500px">
<el-table-column type="index" width="70" fixed label="序号" align="center" />
<el-table-column label="零件名称" align="center" prop="materialName" width="200px" />
<el-table-column label="材质" align="center" prop="compositionName" width="150px"/>
<el-table-column label="规格型号" align="center" prop="spec" width="100"/>
<el-table-column label="数量" align="center" prop="amount" width="100"/>
<el-table-column label="泡沫" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['泡沫']">
<span >
<span >{{ row.map['泡沫'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="下料1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['下料1']">
<span >
<span >{{ row.map['下料1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="下料2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['下料2']">
<span >
<span >{{ row.map['下料2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="电焊" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['电焊']">
<span >
<span >{{ row.map['电焊'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="编程" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['编程']">
<span >
<span >{{ row.map['编程'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="开粗1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['开粗1']">
<span >
<span >{{ row.map['开粗1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="开粗2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['开粗2']">
<span >
<span >{{ row.map['开粗2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="铣床1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['铣床1']">
<span >
<span >{{ row.map['铣床1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="铣床2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['铣床2']">
<span >
<span >{{ row.map['铣床2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="车床1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['车床1']">
<span >
<span >{{ row.map['车床1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="车床2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['车床2']">
<span >
<span >{{ row.map['车床2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="热处理1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['热处理1']">
<span >
<span >{{ row.map['热处理1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="热处理2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['热处理2']">
<span >
<span >{{ row.map['热处理2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="热处理3" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['热处理3']">
<span >
<span >{{ row.map['热处理3'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="磨床1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['磨床1']">
<span >
<span >{{ row.map['磨床1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="磨床2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['磨床2']">
<span >
<span >{{ row.map['磨床2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="数控1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['数控1']">
<span >
<span >{{ row.map['数控1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="数控2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['数控2']">
<span >
<span >{{ row.map['数控2']}}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="数控3" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['数控3']">
<span >
<span >{{ row.map['数控3']}}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="线切割1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['线切割1']">
<span >
<span >{{ row.map['线切割1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="线切割2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['线切割2']">
<span >
<span >{{ row.map['线切割2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="电极" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['电极']">
<span >
<span >{{ row.map['电极'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="火花1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['火花1']">
<span >
<span >{{ row.map['火花1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="火花2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['火花2']">
<span >
<span >{{ row.map['火花2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="刻字" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['刻字']">
<span >
<span >{{ row.map['刻字'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="网格1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['网格1']">
<span >
<span >{{ row.map['网格1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="网格2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['网格2']">
<span >
<span >{{ row.map['网格2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="深孔钻1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['深孔钻1']">
<span >
<span >{{ row.map['深孔钻1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="深孔钻2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['深孔钻2']">
<span >
<span >{{ row.map['深孔钻2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="钻孔1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['钻孔1']">
<span >
<span >{{ row.map['钻孔1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="钻孔2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['钻孔2']">
<span >
<span >{{ row.map['钻孔2'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="单件成本" align="center" prop="assemblyLaborCost" width="120px"/>
</el-table>
</el-card>
<el-card class="hl-card-info" v-if="activeIndex == 'zhuang'">
<!-- <template #header>-->
<!-- <div class="hl-card-info-icona"></div><span class="hl-card-info-text">装配成本</span>-->
@ -506,6 +845,8 @@
const formLoading = ref(false) // 12
const list = ref([]) //
const listcl = ref([]) //
const listng = ref([]) //
const listnc = ref([]) //
// const listFzc = ref([]) //
// const loading = ref(true) //
const activeName = ref('biao')
@ -532,6 +873,7 @@
caiLiaoCost:undefined,
zpCost:undefined,
neiBuCost:undefined,
waixeiCost:undefined
})
const handleClick = async(tab: TabsPaneContext, event: Event) => {
@ -558,6 +900,10 @@
list.value=listData
const listclData = await SaleeOrderCost.getListcl(query.id,query.projectSubId)
listcl.value=listclData
const listNgData = await SaleeOrderCost.getListNg(query.id,query.projectSubId)
listng.value=listNgData
const listNcData = await SaleeOrderCost.getListNc(query.id,query.projectSubId)
listnc.value=listNcData
formData.value.projectName=query.projectName
formData.value.code=query.code
formData.value.customerName=query.customerName
@ -568,6 +914,9 @@
formData.value.caiLiaoCost=query.cailiaoCost
formData.value.zpCost=query.zpCost
formData.value.neiBuCost=query.neibuCost
formData.value.waixeiCost=query.waixeiCost
// if (listYf.value!=null){
// listYf.value.map((item)=>{
// formData.value.yunFeiCost+=item.yunFeiMoney

View File

@ -66,7 +66,7 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border class="hl-table" height="500px">
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border class="hl-table" show-summary :summary-method="getSummaries" height="500px">
<el-table-column type="index" width="70" fixed label="序号" align="center" />
<el-table-column label="项目编号" align="center" prop="code" width="200px" />
<el-table-column label="项目名称" align="center" prop="projectName" width="240px"/>
@ -79,8 +79,8 @@
</el-table-column>
<el-table-column label="设备型号" align="center" prop="deviceModel" width="200px"/>
<el-table-column label="标准件成本" align="center" prop="biaoZhunJianCost" width="200px"/>
<el-table-column label="材料成本" align="center" prop="cailiaoCost" width="200px"/>
<el-table-column label="外协加工费" align="center" prop="waixeiCost" width="200px"/>
<el-table-column label="内部材料成本" align="center" prop="cailiaoCost" width="200px"/>
<el-table-column label="外部材料成本" align="center" prop="waixeiCost" width="200px"/>
<el-table-column label="内部工时费" align="center" prop="neibuCost" width="220px"/>
<el-table-column label="装配工时费" align="center" prop="zpCost" width="220px"/>
<el-table-column label="运费" align="center" prop="yunFeiCost" width="200px"/>
@ -120,6 +120,7 @@ import * as SaleeOrderCost from '@/api/heli/saleordercost'
import * as UserApi from '@/api/system/user'
import {DICT_TYPE} from "@/utils/dict";
import routeParamsCache from '@/utils/routeParamsCache'
import {ElTable} from "element-plus";
defineOptions({ name: 'Shenhe' })
const userList = ref<UserApi.UserVO[]>([]) //
const message = useMessage() //
@ -194,7 +195,72 @@ const handleExport = async () => {
exportLoading.value = false
}
}
const getSummaries = (param: SummaryMethodProps) => {
const summaryField = ["biaoZhunJianCost","cailiaoCost","waixeiCost","neibuCost","zpCost","yunFeiCost","sumCost"];
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (!summaryField.includes(column.property)) {
sums[index] = '';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return floatAdd(prev, curr);
} else {
return prev;
}
}, 0);
const thousandsField = [];
if (thousandsField.includes(column.property)) {
sums[index] = thousandsFormat(sums[index]);
}
} else {
sums[index] = '';
}
});
// const sumValue = computed(() => {
// return list.value.reduce((sum, item) => sum + item.quantityLent, 0);
// });
// const sums = ['','','','','','','','',sumValue];
return sums;
}
const floatAdd = (a, b) => {
var c, d, e;
if (undefined === a || null === a || "" === a || isNaN(a)) { a = 0; }
if (undefined === b || null === b || "" === b || isNaN(b)) { b = 0; }
try {
c = a.toString().split(".")[1].length;
} catch (f) {
c = 0;
}
try {
d = b.toString().split(".")[1].length;
} catch (f) {
d = 0;
}
e = Math.pow(10, Math.max(c, d));
return (floatMul(a, e) + floatMul(b, e)) / e;
};
const floatMul = (a, b) => {
var c = 0,
d = a.toString(),
e = b.toString();
try {
c += d.split(".")[1].length;
} catch (f) {}
try {
c += e.split(".")[1].length;
} catch (f) {}
return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
}
/** 初始化 **/
const route = useRoute()
const routeValue = ref('')

View File

@ -78,7 +78,6 @@ const getListData = async () => {
if (queryParams.pageNo < data.total) {
//
queryParams.pageNo++;
isFinish.value = true;
} else {
//
isFinish.value = true;