【员工工资设置】 DB脚本

dev
siontion 4 months ago
parent 22c70f6eef
commit 3b08bbdba7

@ -54,6 +54,7 @@ public interface ErrorCodeConstants {
ErrorCode PROCESS_NOT_EXISTS = new ErrorCode(1_001_017, "工艺路线不存在");
ErrorCode PROCESS_DETAIL_NOT_EXISTS = new ErrorCode(1_001_018, "工艺路线明细不存在");
ErrorCode PROCESS_SETTING_NOT_EXISTS = new ErrorCode(1_001_019, "工时工价不存在");
ErrorCode SALARY_SETTING_NOT_EXISTS = new ErrorCode(1_001_020, "员工工资设置不存在");
/*********组织架构************/
ErrorCode WORKSHOP_NOT_EXISTS = new ErrorCode(1_002_001, "车间不存在");

@ -38,4 +38,10 @@ public class QuerySaleOrderListResDTO {
@Schema(description = "单据日期")
private LocalDateTime orderTime;
@Schema(description = "物料编码")
private String materialCode;
@Schema(description = "安全库存")
private BigDecimal invSafe;
}

@ -38,10 +38,15 @@ public class QueryBomReqVO extends AbstractChanjetContent {
private String ID;
private String Code;
private String Name;
private String CodeEnd_Child;
public QueryBomDTO(String code) {
Code = code;
}
public QueryBomDTO(String code,String codeEnd_Child) {
CodeEnd_Child = codeEnd_Child;
}
}
}

@ -0,0 +1,95 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog;
import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.salarysetting.SalarySettingDO;
import com.chanko.yunxi.mes.module.biz.service.salarysetting.SalarySettingService;
@Tag(name = "管理后台 - 员工工资设置")
@RestController
@RequestMapping("/biz/salary-setting")
@Validated
public class SalarySettingController {
@Resource
private SalarySettingService salarySettingService;
@PostMapping("/create")
@Operation(summary = "创建员工工资设置")
@PreAuthorize("@ss.hasPermission('biz:salary-setting:create')")
public CommonResult<Long> createSalarySetting(@Valid @RequestBody SalarySettingSaveReqVO createReqVO) {
return success(salarySettingService.createSalarySetting(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新员工工资设置")
@PreAuthorize("@ss.hasPermission('biz:salary-setting:update')")
public CommonResult<Boolean> updateSalarySetting(@Valid @RequestBody SalarySettingSaveReqVO updateReqVO) {
salarySettingService.updateSalarySetting(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除员工工资设置")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:salary-setting:delete')")
public CommonResult<Boolean> deleteSalarySetting(@RequestParam("id") Long id) {
salarySettingService.deleteSalarySetting(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得员工工资设置")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:salary-setting:query')")
public CommonResult<SalarySettingRespVO> getSalarySetting(@RequestParam("id") Long id) {
SalarySettingDO salarySetting = salarySettingService.getSalarySetting(id);
return success(BeanUtils.toBean(salarySetting, SalarySettingRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得员工工资设置分页")
@PreAuthorize("@ss.hasPermission('biz:salary-setting:query')")
public CommonResult<PageResult<SalarySettingRespVO>> getSalarySettingPage(@Valid SalarySettingPageReqVO pageReqVO) {
PageResult<SalarySettingDO> pageResult = salarySettingService.getSalarySettingPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, SalarySettingRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出员工工资设置 Excel")
@PreAuthorize("@ss.hasPermission('biz:salary-setting:export')")
@OperateLog(type = EXPORT)
public void exportSalarySettingExcel(@Valid SalarySettingPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<SalarySettingDO> list = salarySettingService.getSalarySettingPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "员工工资设置.xls", "数据", SalarySettingRespVO.class,
BeanUtils.toBean(list, SalarySettingRespVO.class));
}
}

@ -0,0 +1,37 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 员工工资设置分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SalarySettingPageReqVO extends PageParam {
@Schema(description = "自增字段,唯一")
private Long id;
@Schema(description = "员工id")
private Long userId;
@Schema(description = "工资类型字典")
private String salaryType;
@Schema(description = "工序范围")
private String procedure;
@Schema(description = "状态,1表示正常2表示禁用")
private Boolean status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,43 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat;
import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert;
@Schema(description = "管理后台 - 员工工资设置 Response VO")
@Data
@ExcelIgnoreUnannotated
public class SalarySettingRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "员工id")
@ExcelProperty("员工id")
private Long userId;
@Schema(description = "工资类型字典")
@ExcelProperty(value = "工资类型字典", converter = DictConvert.class)
@DictFormat("biz_salary_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private String salaryType;
@Schema(description = "工序范围")
@ExcelProperty("工序范围")
private String procedure;
@Schema(description = "状态,1表示正常2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("状态,1表示正常2表示禁用")
private Boolean status;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,29 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 员工工资设置新增/修改 Request VO")
@Data
public class SalarySettingSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "员工id")
private Long userId;
@Schema(description = "工资类型字典")
private String salaryType;
@Schema(description = "工序范围")
private String procedure;
@Schema(description = "状态,1表示正常2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "状态,1表示正常2表示禁用不能为空")
private Boolean status;
}

@ -124,6 +124,8 @@ public class MaterialDO extends TenantBaseDO {
*
*/
private BigDecimal invLowerLimit;
private BigDecimal availableQuantity;
/**
*
*/

@ -173,4 +173,15 @@ public class ProjectOrderSubDO extends BaseDO {
@TableField(exist = false)
private Integer unqualifiedQuantity;
@TableField(exist = false)
private String materialCode;
@TableField(exist = false)
private BigDecimal invSafe;
@TableField(exist = false)
private BigDecimal availableQuantity;
@TableField(exist = false)
private Integer orderAmount;
}

@ -0,0 +1,49 @@
package com.chanko.yunxi.mes.module.biz.dal.dataobject.salarysetting;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("base_salary_setting")
@KeySequence("base_salary_setting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SalarySettingDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
* id
*/
private Long userId;
/**
*
*
* {@link TODO biz_salary_type }
*/
private String salaryType;
/**
*
*/
private String procedure;
/**
* ,12
*/
private Boolean status;
}

@ -37,7 +37,8 @@ public interface ProjectOrderSubMapper extends BaseMapperX<ProjectOrderSubDO> {
MPJLambdaWrapper<ProjectOrderSubDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProjectOrderSubDO.class)
.select("a.code as projectOrderCode")
.select("b.code as projectSubCode", "b.name projectSubName", "b.spec", "b.unit")
.select("b.code as projectSubCode", "b.name projectSubName", "b.spec", "b.unit","b.available_quantity")
.select("t.amount as orderAmount")
.leftJoin(ProjectOrderDO.class, "a", ProjectOrderDO::getId, ProjectOrderSubDO::getProjectOrderId)
.leftJoin(MaterialDO.class, "b", MaterialDO::getId, ProjectOrderSubDO::getMaterialId)
.disableSubLogicDel()

@ -0,0 +1,31 @@
package com.chanko.yunxi.mes.module.biz.dal.mysql.salarysetting;
import java.util.*;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.salarysetting.SalarySettingDO;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface SalarySettingMapper extends BaseMapperX<SalarySettingDO> {
default PageResult<SalarySettingDO> selectPage(SalarySettingPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SalarySettingDO>()
.eqIfPresent(SalarySettingDO::getId, reqVO.getId())
.eqIfPresent(SalarySettingDO::getUserId, reqVO.getUserId())
.eqIfPresent(SalarySettingDO::getSalaryType, reqVO.getSalaryType())
.eqIfPresent(SalarySettingDO::getProcedure, reqVO.getProcedure())
.eqIfPresent(SalarySettingDO::getStatus, reqVO.getStatus())
.betweenIfPresent(SalarySettingDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(SalarySettingDO::getId));
}
}

@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanjet.openapi.sdk.java.exception.ChanjetApiException;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.common.util.object.ObjectUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.ChanjetSpi;
@ -54,6 +53,7 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.chanko.yunxi.mes.module.system.dal.mysql.dept.DeptMapper;
import com.chanko.yunxi.mes.module.system.dal.mysql.dict.DictDataMapper;
import com.chanko.yunxi.mes.module.system.service.user.AdminUserService;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
@ -65,6 +65,7 @@ import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
@ -792,13 +793,15 @@ public class ChanjetManager {
// 处理数据
if(!resulDataList.isEmpty()){
Map<String, List<QuerySaleOrderListResDTO>> dataGroupByCode = resulDataList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getExternalCode));
Map<String, List<QuerySaleOrderListResDTO>> dataGroupByCode =
resulDataList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getExternalCode));
List<ProjectOrderDO> doList = projectOrderMapper.selectList(new LambdaQueryWrapper<ProjectOrderDO>() {{
in(ProjectOrderDO::getExternalCode, dataGroupByCode.keySet());
eq(ProjectOrderDO::getOrderSource, ProjectOrderSourceEnum.INTERFACE.getCode());
}});
Map<String, List<ProjectOrderDO>> existsDOGroupByCode = doList.stream().collect(Collectors.groupingBy(ProjectOrderDO::getExternalCode));
Map<String, List<ProjectOrderDO>> existsDOGroupByCode =
doList.stream().collect(Collectors.groupingBy(ProjectOrderDO::getExternalCode));
// 处理
dataGroupByCode.forEach((id, voList) -> {
@ -828,37 +831,114 @@ public class ChanjetManager {
});
saveReqVO.setProjectOrderSubs(subDOList);
projectOrderController.operateProjectOrder(saveReqVO);
CommonResult<Long> orderId = projectOrderController.operateProjectOrder(saveReqVO);
// 根据销售订单的每个产品的BOM找到物料编码为6开头的物料原先的生成生产订单的逻辑不变再另外生成一张生产订单
if(subDOList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).count()>0){
ProjectOrderDO newProjectOrderDO =BeanUtil.toBean(projectOrderMapper.selectById(saveReqVO.getId()),ProjectOrderDO.class);
newProjectOrderDO.setId(null);
newProjectOrderDO.setCode(newProjectOrderDO.getCode()+"-1");
projectOrderMapper.insert(newProjectOrderDO);
List<ProjectOrderSubDO> insertList =subDOList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).collect(Collectors.toList());
insertList.forEach(o->{
o.setId(null);
o.setProjectOrderId(newProjectOrderDO.getId());
// o.setAmount()
});
projectOrderSubMapper.insertBatch(insertList);
// 手动记录日志
operateLogFrameworkService.createOperateLog(request,
LocalDateTime.now(),
BusinessTypeEnum.PROJECT_ORDER.name(),
newProjectOrderDO.getId(),
OperateTypeEnum.valueOf(OperateTypeEnum.SAVE.name()).getType(),
"");
if(voList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).count()>0){
saveSemiFinishedProjectOrder(orderId.getData(),voList);
}
}
});
}
}
@SneakyThrows
private void saveSemiFinishedProjectOrder(Long orderId, List<QuerySaleOrderListResDTO> subDOList){
ProjectOrderDO newProjectOrderDO =BeanUtil.toBean(projectOrderMapper.selectById(orderId),ProjectOrderDO.class);
newProjectOrderDO.setId(null)
.setCode(newProjectOrderDO.getCode()+"-1")
.setStatus(ValidStatusEnum.VALID.getCode())
.setOrderSource(ProjectOrderSourceEnum.INTERFACE.getCode())
.setOrderStatus(ProjectOrderStatusEnum.SAVE.getCode())
.setIsUrgency(YesOrNoEnum.N.getCode());
// 保存订单信息
projectOrderMapper.insert(newProjectOrderDO);
List<QuerySaleOrderListResDTO> queryMatList =subDOList.stream().filter(sub ->{ return sub.getMaterialId().toString().startsWith("6");}).collect(Collectors.toList());
List<String> matCodes = new ArrayList<>();
queryMatList.forEach(mat->{
MaterialDO materialDO = materialMapper.selectById(mat.getMaterialId());
if(materialDO !=null){
mat.setMaterialCode(materialDO.getCode());
mat.setInvSafe(materialDO.getInvSafe());
if(!matCodes.contains(mat.getMaterialCode())){
matCodes.add(mat.getMaterialCode());
}
}
});
// 查询当前物料的实时库存
List<QueryCurrentStockResVO> stockCurrentDatas = queryStock(matCodes,newProjectOrderDO.getWarehouseId());
List<ProjectOrderSubDO> insertList = new ArrayList<>(16);
for (QuerySaleOrderListResDTO o : queryMatList) {
Double matAmount = (double) 0;
if(insertList.stream().filter(uo -> uo.getMaterialCode().equals(o.getMaterialCode())).count()==0
&& materialMapper.selectById(o.getMaterialId())!=null){
ProjectOrderSubDO projectOrderSubDO = new ProjectOrderSubDO();
projectOrderSubDO.setProjectOrderId(newProjectOrderDO.getId()).setMaterialId(o.getMaterialId());
if (!StringUtils.isEmpty(o.getMaterialCode())) {
// 查询当前物料子件物料信息
CommonResult<List<QueryBomResVO>> bomDataList =
chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(o.getMaterialCode())), QueryBomResVO.class);
// 子件生产数量
AtomicReference<Double> produceQuantity = new AtomicReference<>(0d);
// 子件需求数量
AtomicReference<Double> requiredQuantity = new AtomicReference<>(0d);
bomDataList.getData().get(0).getBOMChildDTOs().forEach(ch->{
produceQuantity.updateAndGet(v -> v + ch.getProduceQuantity());
requiredQuantity.updateAndGet(v -> v + ch.getRequiredQuantity());
});
// 查询当前物料父件物料信息
QueryBomReqVO queryBomReqVOAsChild = new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(null,o.getMaterialCode()));
CommonResult<List<QueryBomResVO>> result =
chanjetSpi.invokeRetList(QUERY_BOM, queryBomReqVOAsChild,QueryBomResVO.class);
AtomicReference<Integer> parantAmount = new AtomicReference<>(0);
if(result!= null && result.getData()!=null) {
subDOList.stream().collect(Collectors.groupingBy(QuerySaleOrderListResDTO::getMaterialId)).forEach((mid, mList) -> {
if (mid.equals(result.getData().get(0).getID())){
parantAmount.set(mList.stream().mapToInt(QuerySaleOrderListResDTO::getAmount).sum());
}
});
}
QueryCurrentStockResVO currentStock =
stockCurrentDatas.stream().filter(stock->{
return stock.getInventoryCode().equals(o.getMaterialCode());
}).collect(Collectors.toList()).get(0);
// 该物料的实时库存
Integer availableQuantity = currentStock==null?0:new Integer(currentStock.getAvailableQuantity());
matAmount = (requiredQuantity.get()==0 ?0:produceQuantity.get()/requiredQuantity.get())*parantAmount.get()-availableQuantity+o.getInvSafe().doubleValue();
}
projectOrderSubDO.setAmount(matAmount.intValue());
insertList.add(projectOrderSubDO);
}
}
// 保存订单产品信息
if(!CollUtil.isEmpty(insertList)) {
projectOrderSubMapper.insertBatch(insertList);
}
// 手动记录日志
operateLogFrameworkService.createOperateLog(request,
LocalDateTime.now(),
BusinessTypeEnum.PROJECT_ORDER.name(),
newProjectOrderDO.getId(),
OperateTypeEnum.valueOf(OperateTypeEnum.SAVE.name()).getType(),
"");
}
/**
* bom
*
@ -874,7 +954,8 @@ public class ChanjetManager {
List<BOMChildDTOs> bomDataList = null;
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<List<QueryBomResVO>> result = chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(materialCode)), QueryBomResVO.class);
CommonResult<List<QueryBomResVO>> result =
chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(materialCode)), QueryBomResVO.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}

@ -2,9 +2,11 @@ package com.chanko.yunxi.mes.module.biz.service.projectorder;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanjet.openapi.sdk.java.exception.ChanjetApiException;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.vo.QueryCurrentStockResVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.projectorder.vo.ProjectOrderPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.projectorder.vo.ProjectOrderSaveReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.projectorder.vo.ProjectOrderSubPageReqVO;
@ -17,6 +19,7 @@ import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderSubMap
import com.chanko.yunxi.mes.module.biz.enums.BusinessTypeEnum;
import com.chanko.yunxi.mes.module.biz.enums.ProjectOrderStatusEnum;
import com.chanko.yunxi.mes.module.biz.enums.YesOrNoEnum;
import com.chanko.yunxi.mes.module.biz.manager.ChanjetManager;
import com.chanko.yunxi.mes.module.biz.service.customer.CustomerService;
import com.chanko.yunxi.mes.module.biz.service.serialnumber.SerialNumberService;
import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO;
@ -26,11 +29,13 @@ import com.github.dadiyang.equator.GetterBaseEquator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@ -65,6 +70,9 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Resource
private FileService fileService;
@Resource
private ChanjetManager chanjetManager;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) {
@ -78,14 +86,21 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
CustomerDO customer = customerService.getCustomer(projectOrder.getCustomerId());
projectOrder.setCode(PROJECT_ORDER.getCode(customer.getCode(), serialNumberDO.getSerialNumber().toString()));
projectOrder.setOrderStatus(ProjectOrderStatusEnum.valueOf(createReqVO.getActive()).getCode());
if(!StringUtils.isEmpty(createReqVO.getExternalCode())){
projectOrder.setCode(projectOrder.getExternalCode());
}
projectOrderMapper.insert(projectOrder);
// 插入子表
createProjectOrderSubList(projectOrder.getId(), createReqVO.getProjectOrderSubs());
createReqVO.setId(projectOrder.getId()).setCode(projectOrder.getCode());
// 回写序列记录
serialNumberService.updateSerialNumber(serialNumberDO);
if(StringUtils.isEmpty(createReqVO.getExternalCode())){
// 回写序列记录
serialNumberService.updateSerialNumber(serialNumberDO);
}
// 返回
return projectOrder.getId();
}
@ -206,6 +221,28 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Override
public List<ProjectOrderSubDO> getProjectOrderSubListByProjectOrderId(Long projectOrderId) {
List<ProjectOrderSubDO> projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderId);
ProjectOrderDO projectOrderDO = projectOrderMapper.selectById(projectOrderId);
List<String> matCodes = new ArrayList<>();
projectOrderSubDOList.forEach(vo->{
if(!matCodes.contains(vo.getProjectSubCode())){
matCodes.add(vo.getProjectSubCode());
}
});
try {
List<QueryCurrentStockResVO> stockMatDatas = chanjetManager.queryStock(matCodes,projectOrderDO.getWarehouseId());
projectOrderSubDOList.forEach(vo->{
if(stockMatDatas.stream().filter(mo->mo.getInventoryCode().equals(vo.getProjectSubCode())).count()>0){
vo.setOrderAmount(new Integer(stockMatDatas.stream().filter(mo->mo.getInventoryCode().equals(vo.getProjectSubCode())).collect(Collectors.toList()).get(0).getAvailableQuantity()));
}else{
vo.setOrderAmount(0);
}
});
} catch (ChanjetApiException e) {
throw new RuntimeException(e);
}
return projectOrderSubDOList;
}

@ -0,0 +1,55 @@
package com.chanko.yunxi.mes.module.biz.service.salarysetting;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.salarysetting.SalarySettingDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* Service
*
* @author
*/
public interface SalarySettingService {
/**
*
*
* @param createReqVO
* @return
*/
Long createSalarySetting(@Valid SalarySettingSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateSalarySetting(@Valid SalarySettingSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteSalarySetting(Long id);
/**
*
*
* @param id
* @return
*/
SalarySettingDO getSalarySetting(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<SalarySettingDO> getSalarySettingPage(SalarySettingPageReqVO pageReqVO);
}

@ -0,0 +1,74 @@
package com.chanko.yunxi.mes.module.biz.service.salarysetting;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.salarysetting.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.salarysetting.SalarySettingDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.biz.dal.mysql.salarysetting.SalarySettingMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class SalarySettingServiceImpl implements SalarySettingService {
@Resource
private SalarySettingMapper salarySettingMapper;
@Override
public Long createSalarySetting(SalarySettingSaveReqVO createReqVO) {
// 插入
SalarySettingDO salarySetting = BeanUtils.toBean(createReqVO, SalarySettingDO.class);
salarySettingMapper.insert(salarySetting);
// 返回
return salarySetting.getId();
}
@Override
public void updateSalarySetting(SalarySettingSaveReqVO updateReqVO) {
// 校验存在
validateSalarySettingExists(updateReqVO.getId());
// 更新
SalarySettingDO updateObj = BeanUtils.toBean(updateReqVO, SalarySettingDO.class);
salarySettingMapper.updateById(updateObj);
}
@Override
public void deleteSalarySetting(Long id) {
// 校验存在
validateSalarySettingExists(id);
// 删除
salarySettingMapper.deleteById(id);
}
private void validateSalarySettingExists(Long id) {
if (salarySettingMapper.selectById(id) == null) {
throw exception(SALARY_SETTING_NOT_EXISTS);
}
}
@Override
public SalarySettingDO getSalarySetting(Long id) {
return salarySettingMapper.selectById(id);
}
@Override
public PageResult<SalarySettingDO> getSalarySettingPage(SalarySettingPageReqVO pageReqVO) {
return salarySettingMapper.selectPage(pageReqVO);
}
}

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.biz.dal.mysql.salarysetting.SalarySettingMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,39 @@
import request from '@/config/axios'
export interface SalarySettingVO {
id: number
userId: number
salaryType: string
procedure: string
status: boolean
}
// 查询员工工资设置分页
export const getSalarySettingPage = async (params) => {
return await request.get({ url: `/biz/salary-setting/page`, params })
}
// 查询员工工资设置详情
export const getSalarySetting = async (id: number) => {
return await request.get({ url: `/biz/salary-setting/get?id=` + id })
}
// 新增员工工资设置
export const createSalarySetting = async (data: SalarySettingVO) => {
return await request.post({ url: `/biz/salary-setting/create`, data })
}
// 修改员工工资设置
export const updateSalarySetting = async (data: SalarySettingVO) => {
return await request.put({ url: `/biz/salary-setting/update`, data })
}
// 删除员工工资设置
export const deleteSalarySetting = async (id: number) => {
return await request.delete({ url: `/biz/salary-setting/delete?id=` + id })
}
// 导出员工工资设置 Excel
export const exportSalarySetting = async (params) => {
return await request.download({ url: `/biz/salary-setting/export-excel`, params })
}

@ -0,0 +1,114 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工id" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工id" />
</el-form-item>
<el-form-item label="工资类型字典" prop="salaryType">
<el-select v-model="formData.salaryType" placeholder="请选择工资类型字典">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_SALARY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="工序范围" prop="procedure">
<el-input v-model="formData.procedure" placeholder="请输入工序范围" />
</el-form-item>
<el-form-item label="状态,1表示正常2表示禁用" prop="status">
<el-radio-group v-model="formData.status">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import * as SalarySettingApi from '@/api/biz/salarysetting'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
salaryType: undefined,
procedure: undefined,
status: undefined,
})
const formRules = reactive({
status: [{ required: true, message: '状态,1表示正常2表示禁用不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SalarySettingApi.getSalarySetting(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as SalarySettingApi.SalarySettingVO
if (formType.value === 'create') {
await SalarySettingApi.createSalarySetting(data)
message.success(t('common.createSuccess'))
} else {
await SalarySettingApi.updateSalarySetting(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
salaryType: undefined,
procedure: undefined,
status: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,241 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="自增字段,唯一" prop="id">
<el-input
v-model="queryParams.id"
placeholder="请输入自增字段,唯一"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="员工id" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工资类型字典" prop="salaryType">
<el-select
v-model="queryParams.salaryType"
placeholder="请选择工资类型字典"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_SALARY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="工序范围" prop="procedure">
<el-input
v-model="queryParams.procedure"
placeholder="请输入工序范围"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态,1表示正常2表示禁用" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态,1表示正常2表示禁用"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['biz:salary-setting:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:salary-setting:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="自增字段,唯一" align="center" prop="id" />
<el-table-column label="员工id" align="center" prop="userId" />
<el-table-column label="工资类型字典" align="center" prop="salaryType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BIZ_SALARY_TYPE" :value="scope.row.salaryType" />
</template>
</el-table-column>
<el-table-column label="工序范围" align="center" prop="procedure" />
<el-table-column label="状态,1表示正常2表示禁用" align="center" prop="status" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['biz:salary-setting:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['biz:salary-setting:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<SalarySettingForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as SalarySettingApi from '@/api/biz/salarysetting'
import SalarySettingForm from './SalarySettingForm.vue'
defineOptions({ name: 'SalarySetting' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
id: undefined,
userId: undefined,
salaryType: undefined,
procedure: undefined,
status: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SalarySettingApi.getSalarySettingPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SalarySettingApi.deleteSalarySetting(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SalarySettingApi.exportSalarySetting(queryParams)
download.excel(data, '员工工资设置.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -252,6 +252,7 @@ alter table pro_task_dispatch_detail add column `owner_ids` VARCHAR(128) null co
alter table pro_task_dispatch_detail modify column `owner` bigint(20) null comment '负责人' ;
alter table pro_task_report add COLUMN `has_synch` tinyint(1) default null comment '是否已同步用友';
drop table if exists `pro_task_dispatch_detail_owner`;
CREATE TABLE `pro_task_dispatch_detail_owner` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`dispatch_id` bigint(20) NOT NULL COMMENT '派工单id',
@ -276,6 +277,24 @@ CREATE TABLE `pro_task_dispatch_detail_owner` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB COMMENT='派工明细表';
alter table pro_task_dispatch_detail add COLUMN `detail_owner_id` bigint(20)default null comment '派工明细拆分前对应id' after id;
alter table pro_task_dispatch_detail add COLUMN `detail_owner_id` bigint(20) default null comment '派工明细拆分前对应id' after id;
update pro_task_dispatch_detail as a set detail_owner_id =(select id from pro_task_dispatch_detail_owner where owner_ids is not null and dispatch_id=a.dispatch_id and procedure_id=a.procedure_id and owner_ids=a.owner_ids limit 1)
update pro_task_dispatch_detail as a set detail_owner_id =(select id from pro_task_dispatch_detail_owner where owner_ids is not null and dispatch_id=a.dispatch_id and procedure_id=a.procedure_id and owner_ids=a.owner_ids limit 1);
alter table base_material add COLUMN `available_quantity` decimal(20,6) DEFAULT NULL COMMENT '库存数量';
drop table if exists `base_salary_setting`;
CREATE TABLE `base_salary_setting` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`user_id` bigint(20) DEFAULT NULL COMMENT '员工id',
`salary_type` varchar(64) DEFAULT NULL COMMENT '工资类型字典',
`procedure` varchar(512) DEFAULT NULL COMMENT '工序范围',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态,1表示正常2表示禁用',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='员工工资设置';
Loading…
Cancel
Save