package doumeemes.service.business.impl; import doumeemes.core.constants.ResponseStatus; import doumeemes.core.exception.BusinessException; import doumeemes.core.model.LoginUserInfo; import doumeemes.core.model.PageData; import doumeemes.core.model.PageWrap; import doumeemes.core.utils.Constants; import doumeemes.core.utils.Utils; import doumeemes.core.utils.excel.EasyExcelUtil; import doumeemes.dao.business.*; import doumeemes.dao.business.model.*; import doumeemes.dao.business.vo.SalaryParamVO; import doumeemes.dao.ext.MaterialExtMapper; import doumeemes.dao.ext.dto.SalaryParamDTO; import doumeemes.dao.ext.dto.SalaryParamImportDTO; import doumeemes.dao.ext.vo.DepartmentExtListVO; import doumeemes.service.business.DepartmentService; import doumeemes.service.business.SalaryParamService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import doumeemes.service.ext.DepartmentExtService; import org.apache.shiro.SecurityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.util.*; /** * 设置类-绩效工资配置表Service实现 * @author 江蹄蹄 * @date 2023/08/11 15:29 */ @Service public class SalaryParamServiceImpl implements SalaryParamService { @Autowired private SalaryParamMapper salaryParamMapper; @Autowired private DepartmentMapper departmentMapper; @Lazy @Autowired private DepartmentExtService departmentExtService; @Autowired private MaterialMapper materialMapper; @Autowired private MaterialDistributeMapper materialDistributeMapper; @Autowired private ProceduresMapper proceduresMapper; @Override public Integer create(SalaryParam salaryParam) { LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); DepartmentExtListVO department =departmentExtService.getModelById(principal.getCompany().getId(),salaryParam.getDepartId()); Integer comDepartId = departmentExtService.getComDepartId(department); SalaryParam insert = new SalaryParam(); insert.setRootDepartId(principal.getRootDepartment().getId()); insert.setDepartId(salaryParam.getDepartId()); // insert.setDepartId(comDepartId); insert.setProcedureId(salaryParam.getProcedureId()); insert.setMaterialId(salaryParam.getMaterialId()); insert.setDeleted((byte) Constants.ZERO); insert.setType(salaryParam.getType()); if(findOne(insert) != null){ throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(),"同一个物料在相同工序不能重复配置哦!"); } insert.setCreateUser(principal.getId()); insert.setCreateTime(new Date()); insert.setUpdateUser(principal.getId()); insert.setUpdateTime(new Date()); insert.setRemark(salaryParam.getRemark()); insert.setSalary(salaryParam.getSalary().multiply(new BigDecimal("100"))); insert.setNum(salaryParam.getNum()); insert.setTimes(salaryParam.getTimes()); insert.setUnqualified(salaryParam.getUnqualified()); insert.setType(salaryParam.getType()); salaryParamMapper.insert(insert); return salaryParam.getId(); } @Override public void deleteById(Integer id) { salaryParamMapper.deleteById(id); } @Override public void delete(SalaryParam salaryParam) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(salaryParam); salaryParamMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } salaryParamMapper.deleteBatchIds(ids); } @Override public void updateById(SalaryParam salaryParam) { salaryParamMapper.updateById(salaryParam); } @Override public void update(SalaryParam salaryParam) { LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.lambda() .eq(SalaryParam::getId,salaryParam.getId()) .set(SalaryParam::getUpdateTime,new Date()) .set(SalaryParam::getUpdateUser,principal.getId()) .set(SalaryParam::getType,salaryParam.getType()) // .set(SalaryParam::getDepartId,salaryParam.getDepartId()) // .set(SalaryParam::getMaterialId,salaryParam.getMaterialId()) // .set(SalaryParam::getProcedureId,salaryParam.getProcedureId()) .set(SalaryParam::getSalary,salaryParam.getSalary().multiply(new BigDecimal(100))) .set(SalaryParam::getNum,salaryParam.getNum()) .set(SalaryParam::getTimes,salaryParam.getTimes()) .set(SalaryParam::getUnqualified,salaryParam.getUnqualified()); salaryParamMapper.update(null,wrapper); } @Override public void updateByIdInBatch(List salaryParams) { if (CollectionUtils.isEmpty(salaryParams)) { return; } for (SalaryParam salaryParam: salaryParams) { this.updateById(salaryParam); } } @Override public SalaryParam findById(Integer id) { return salaryParamMapper.selectById(id); } @Override public SalaryParam findOne(SalaryParam salaryParam) { QueryWrapper wrapper = new QueryWrapper<>(salaryParam); wrapper.last("limit 1"); return salaryParamMapper.selectOne(wrapper); } @Override public List findList(SalaryParam salaryParam) { QueryWrapper wrapper = new QueryWrapper<>(salaryParam); return salaryParamMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); SalaryParamDTO model = pageWrap.getModel(); model.setRootDepartId(principal.getRootDepartment().getId()); // model.setDepartId(principal.getCurComDepartment().getId()); IPage salaryParamVOIPage = salaryParamMapper.selectPage(page, model); if (!CollectionUtils.isEmpty(salaryParamVOIPage.getRecords())){ salaryParamVOIPage.getRecords().forEach(s->s.setSalary(s.getSalary().divide(new BigDecimal(100)))); } return PageData.from(salaryParamVOIPage); } @Override public long count(SalaryParam salaryParam) { QueryWrapper wrapper = new QueryWrapper<>(salaryParam); return salaryParamMapper.selectCount(wrapper); } @Transactional(rollbackFor = {Exception.class,BusinessException.class}) @Override public void importPlans(MultipartFile file) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); if(!Constants.equalsInteger(user.getType(),Constants.USERTYPE.COM)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,您无权限进行该操作!"); } //解析excel List plansList = EasyExcelUtil.importExcel(file, 1, 1, SalaryParamImportDTO.class); if(plansList == null || plansList.size()==0){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!"); } plansList.forEach(s->{ if (Objects.isNull(s.getType()) || Objects.isNull(s.getDepartName()) || Objects.isNull(s.getMaterialCode()) || Objects.isNull(s.getProcedureName()) || Objects.isNull(s.getNum())){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容有误!"); } }); for (int i = 0; i < plansList.size(); i++) { SalaryParamImportDTO salaryParamImportDTO = plansList.get(i); // // QueryWrapper wrapper = new QueryWrapper<>(); // wrapper.lambda() // .eq(Department::getName,salaryParamImportDTO.getDepartName()) // .eq(Department::getType,Constants.DEPART_TYPE.factory) // .eq(Department::getDeleted,Constants.ZERO) // .last("limit 1"); Department dparam = new Department(); dparam.setName(salaryParamImportDTO.getDepartName()); dparam.setDeleted(Constants.ZERO); dparam.setType(Constants.DEPART_TYPE.factory); dparam = departmentExtService.findOne(dparam); if (Objects.isNull(dparam)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【工厂组织】有误!"); } DepartmentExtListVO department = new DepartmentExtListVO(); department.setId(dparam.getId()); department.setType(dparam.getType()); department.setParentId(dparam.getParentId()); department.setRootId(dparam.getRootId()); department.setCompanyId(dparam.getCompanyId()); Integer comDepartId = departmentExtService.getComDepartId(department); QueryWrapper materialWrapper = new QueryWrapper<>(); materialWrapper.lambda() .eq(Material::getCode,salaryParamImportDTO.getMaterialCode()) .eq(Material::getRootDepartId,dparam.getRootId()) .eq(Material::getDeleted,Constants.ZERO) .last("limit 1"); Material material = materialMapper.selectOne(materialWrapper); if (Objects.isNull(material)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【产品编码】有误!"); } if (Objects.nonNull(material) && !Objects.equals(material.getName(),salaryParamImportDTO.getMaterialName())){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【产品名称】有误!"); } QueryWrapper materialDistributeQueryWrapper = new QueryWrapper<>(); materialDistributeQueryWrapper.lambda() .eq(MaterialDistribute::getMaterialId,material.getId()) .eq(MaterialDistribute::getRootDepartId,department.getRootId()) .eq(MaterialDistribute::getDepartId, comDepartId) .eq(MaterialDistribute::getDeleted,Constants.ZERO) .last("limit 1"); MaterialDistribute materialDistribute = materialDistributeMapper.selectOne(materialDistributeQueryWrapper); if (Objects.isNull(materialDistribute)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【产品编码】有误!"); } QueryWrapper proceduresWrapper = new QueryWrapper<>(); proceduresWrapper.lambda() .eq(Procedures::getName,salaryParamImportDTO.getProcedureName()) .eq(Procedures::getRootDepartId,department.getRootId()) // .eq(Procedures::getOrgId,department.getId()) .last("limit 1"); Procedures procedures = proceduresMapper.selectOne(proceduresWrapper); if (Objects.isNull(procedures)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "导入数据内容【工序名称】有误!"); } SalaryParam salaryParam = new SalaryParam(); salaryParam.setRootDepartId(department.getRootId()); salaryParam.setDepartId(dparam.getId()); salaryParam.setProcedureId(procedures.getId()); salaryParam.setMaterialId(materialDistribute.getId()); salaryParam.setSalary(salaryParamImportDTO.getSalary()); salaryParam.setNum(new BigDecimal(salaryParamImportDTO.getNum())); salaryParam.setTimes(getIntegerTimes(salaryParamImportDTO.getTimesName())); Integer unqualified = Optional.ofNullable(salaryParamImportDTO.getUnqualified()).map(s -> { if ("否".equals(s)) { return 0; } else { return 1; } }).orElse(0); salaryParam.setUnqualified(unqualified); Integer type = Optional.ofNullable(salaryParamImportDTO.getType()).map(s -> { if ("计件".equals(s)) { return 0; } else { return 1; } }).orElse(0); salaryParam.setType(type); create(salaryParam); } } private Integer getIntegerTimes(String a) { int h =0,m=0,s=0; try{ int hIndex =a.lastIndexOf("小时"); int mIndex=a.lastIndexOf("分钟"); int sIndex =a.lastIndexOf("秒"); if( hIndex>0){ h = Integer.parseInt(a.substring(0,hIndex)); } if(mIndex > hIndex){ m = Integer.parseInt(a.substring(hIndex >=0?hIndex+2:0,mIndex)); } if(sIndex > mIndex){ s = Integer.parseInt(a.substring(mIndex >= 0 ? mIndex+2 : 0, sIndex)); } return h*3600+m*60+s; }catch (Exception e){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,时长【"+a+"】格式不正确!" ); } } }