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+"】格式不正确!" ); 
 | 
        } 
 | 
  
 | 
    } 
 | 
} 
 |