| 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<SalaryParam> deleteWrapper = new UpdateWrapper<>(salaryParam); | 
|         salaryParamMapper.delete(deleteWrapper); | 
|     } | 
|   | 
|     @Override | 
|     public void deleteByIdInBatch(List<Integer> 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<SalaryParam> 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<SalaryParam> 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<SalaryParam> wrapper = new QueryWrapper<>(salaryParam); | 
|         wrapper.last("limit 1"); | 
|         return salaryParamMapper.selectOne(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public List<SalaryParam> findList(SalaryParam salaryParam) { | 
|         QueryWrapper<SalaryParam> wrapper = new QueryWrapper<>(salaryParam); | 
|         return salaryParamMapper.selectList(wrapper); | 
|     } | 
|   | 
|     @Override | 
|     public PageData<SalaryParamVO> findPage(PageWrap<SalaryParamDTO> pageWrap) { | 
|         IPage<SalaryParam> 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<SalaryParamVO> 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<SalaryParam> 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<SalaryParamImportDTO> 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<Department> 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<Material> 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<MaterialDistribute> 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<Procedures> 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+"】格式不正确!" ); | 
|         } | 
|   | 
|     } | 
| } |