diff --git a/src/com/engine/salary/entity/salaryacct/param/MzqQueryParam.java b/src/com/engine/salary/entity/salaryacct/param/MzqQueryParam.java new file mode 100644 index 000000000..fab3b43f8 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/param/MzqQueryParam.java @@ -0,0 +1,28 @@ +package com.engine.salary.entity.salaryacct.param; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * @author Harryxzy + * @ClassName MzqQueryParam + * @date 2025/03/25 15:49 + * @description 美之高 查询参数 + */ +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Data +public class MzqQueryParam { + + // 日期 + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date salaryMonth ; + + +} diff --git a/src/com/engine/salary/entity/salaryacct/po/MzgBzBaseInfo.java b/src/com/engine/salary/entity/salaryacct/po/MzgBzBaseInfo.java new file mode 100644 index 000000000..8c7c91f64 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/po/MzgBzBaseInfo.java @@ -0,0 +1,35 @@ +package com.engine.salary.entity.salaryacct.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Harryxzy + * @ClassName MzgBzBaseInfo + * @date 2025/03/26 15:24 + * @description 美指高班组基础信息 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class MzgBzBaseInfo { + + /** + * 对应字段 + */ + private String dyzd; + + /** + * 科室名称 + */ + private String ksmc; + + /** + * 班组名称 + */ + private String bzmc; +} diff --git a/src/com/engine/salary/entity/salaryacct/po/MzgCpddData.java b/src/com/engine/salary/entity/salaryacct/po/MzgCpddData.java new file mode 100644 index 000000000..028a85231 --- /dev/null +++ b/src/com/engine/salary/entity/salaryacct/po/MzgCpddData.java @@ -0,0 +1,40 @@ +package com.engine.salary.entity.salaryacct.po; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.Map; + +/** + * @author Harryxzy + * @ClassName MzgCpddData + * @date 2025/03/25 16:07 + * @description 美之高 产品订单表 + */ + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class MzgCpddData { + String journalid; + String bm; + String zzzb; + String scgdh; + String wlbh; + String cpxh; + String wlmc; + String tzbh; + String rksl; + String sl; + Date rq; + + String jsxs; + + String jsgzcl; + + Map valueMap; +} diff --git a/src/com/engine/salary/service/SalaryAcctResultService.java b/src/com/engine/salary/service/SalaryAcctResultService.java index ac7309950..a32e35aa4 100644 --- a/src/com/engine/salary/service/SalaryAcctResultService.java +++ b/src/com/engine/salary/service/SalaryAcctResultService.java @@ -231,4 +231,8 @@ public interface SalaryAcctResultService { * @version 1.0 **/ List listBySobSalaryMonth(Date salaryMonth, Long salarySobId, List employeeIds); + + void generateMzgCpjsgzcl(MzqQueryParam param); + + void generateMzgCpjsgzdj(MzqQueryParam param); } diff --git a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java index 0c093a6d1..2fcfd7046 100644 --- a/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java +++ b/src/com/engine/salary/service/impl/SalaryAcctResultServiceImpl.java @@ -25,6 +25,7 @@ import com.engine.salary.entity.salaryacct.dto.SalaryAcctResultListColumnDTO; import com.engine.salary.entity.salaryacct.param.*; import com.engine.salary.entity.salaryacct.po.*; import com.engine.salary.entity.salaryformula.ExpressFormula; +import com.engine.salary.entity.salaryformula.po.FormulaVar; import com.engine.salary.entity.salaryitem.po.SalaryItemPO; import com.engine.salary.entity.salarysob.dto.*; import com.engine.salary.entity.salarysob.po.*; @@ -35,9 +36,12 @@ import com.engine.salary.enums.common.FilterEnum; import com.engine.salary.enums.salaryaccounting.LockStatusEnum; import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum; import com.engine.salary.enums.salaryaccounting.SalaryAcctResultDataSourceEnum; +import com.engine.salary.enums.salaryformula.ReferenceTypeEnum; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.exception.SalaryRunTimeException; +import com.engine.salary.formlua.entity.parameter.DataType; +import com.engine.salary.formlua.entity.standard.ExcelResult; import com.engine.salary.mapper.salaryacct.SalaryAcctResultMapper; import com.engine.salary.report.service.SalaryStatisticsReportService; import com.engine.salary.report.service.impl.SalaryStatisticsReportServiceImpl; @@ -66,10 +70,17 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.util.StopWatch; +import weaver.conn.RecordSet; +import weaver.conn.RecordSetDataSource; +import weaver.formmode.setup.ModeRightInfo; import weaver.general.BaseBean; +import weaver.general.TimeUtil; import weaver.hrm.User; +import weaver.wechat.util.Utils; +import java.io.UnsupportedEncodingException; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.BlockingDeque; import java.util.concurrent.CountDownLatch; @@ -200,6 +211,9 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe return ServiceUtil.getService(SalaryApprovalRuleServiceImpl.class, user); } + private FormulaRunService getFormulaRunService(User user) { + return ServiceUtil.getService(FormulaRunServiceImpl.class, user); + } private SalaryCheckResultService salaryCheckResultService; @@ -1283,4 +1297,445 @@ public class SalaryAcctResultServiceImpl extends Service implements SalaryAcctRe encryptUtil.decryptList(salaryAcctResultPOS, SalaryAcctResultPO.class); return salaryAcctResultPOS; } + + @Override + public void generateMzgCpjsgzcl(MzqQueryParam param) { + if (param.getSalaryMonth() == null) { + throw new SalaryRunTimeException("参数错误"); + } + // 获取美之高erp产品订单数据 + Date firstDayDateOfMonth = SalaryDateUtil.getFirstDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth()); + Date lastDayDateOfMonth = SalaryDateUtil.getLastDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth()); + log.info("开始生成美之高产品计算工资产量,开始日期{},结束日期{}",firstDayDateOfMonth,lastDayDateOfMonth); + List mzgCpddDataList = getERPCpddDataByDate(firstDayDateOfMonth, lastDayDateOfMonth); + log.info("产品计算工资产量erp数据数" + mzgCpddDataList.size()); + // 获取部门对应系数规则数据 + Map bmdyxsMap = getMzgBmdyxsMap(); + // 获取计算系数,计算工资产量 + for (MzgCpddData erpData : mzgCpddDataList) { + String bm = erpData.getBm(); + ExpressFormula formula = bmdyxsMap.get(bm); + if (formula != null) { + List formulaVars = new ArrayList<>(); + ExcelResult result = new ExcelResult(); + try { + double sl = NumberUtils.isCreatable(erpData.getSl()) ? Math.abs(Double.valueOf(erpData.getSl())) : 0; + double rksl = NumberUtils.isCreatable(erpData.getRksl()) ? Math.abs(Double.valueOf(erpData.getRksl())) : 0; + formulaVars.add(FormulaVar.builder().fieldId("数量").content(String.valueOf(sl)).fieldType(DataType.NUMBER).build()); + formulaVars.add(FormulaVar.builder().fieldId("入库数量").content(String.valueOf(rksl)).fieldType(DataType.NUMBER).build()); + result = getFormulaRunService(user).run(formula, formulaVars, DataCollectionEmployee.builder().employeeId((long) user.getUID()).build()); + } catch (Exception e) { + log.error("express execute fail ", e); + result.setStatus(false); + result.setErrorMsg(e.getMessage()); + } + + if (result.isStatus() && NumberUtils.isCreatable(Utils.null2String(result.getData()))) { + BigDecimal xsValue = new BigDecimal(result.getData().toString()); + erpData.setJsxs(xsValue.toPlainString()); + BigDecimal rkslValue = NumberUtils.isCreatable(erpData.getRksl()) ? new BigDecimal(erpData.getRksl()) : BigDecimal.ZERO; + erpData.setJsgzcl(rkslValue.multiply(xsValue).toPlainString()); + } else { + String errorMsg = result.getErrorMsg(); + log.error("计算出错 id:{}, formula:{}, formulaVars:{}, errorMsg",erpData.getJournalid(), formula, formulaVars, errorMsg); + } + } + } + + // 入库,权限重构 + if (CollectionUtils.isNotEmpty(mzgCpddDataList)) { + log.info("产品计算工资产量开始入库"); + RecordSet rs = new RecordSet(); + // 入库前先删除 + String deleteSql = "delete from uf_cpjsgzcl where rq >=? and rq <= ?"; + rs.executeUpdate(deleteSql, new Object[]{SalaryDateUtil.getFormatLocalDate(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDate(lastDayDateOfMonth)}); + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + BaseBean baseBean = new BaseBean(); + String modeId = baseBean.getPropValue("mzgSalaryReport", "cpjsgzcl_mode_id"); + // 先插入一条数据 + MzgCpddData firstData = mzgCpddDataList.get(0); + StringBuilder firstSb = new StringBuilder(); + firstSb.append("insert into uf_cpjsgzcl(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,bm,zzzb,scgdh,wlbh,cpxh,wlmc,tzbh,rksl,sl,rq,jsxs,jsgzcl) values ("); + firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'") + .append(firstData.getJournalid()).append("','") + .append(firstData.getBm()).append("','") + .append(firstData.getZzzb()).append("','") + .append(firstData.getScgdh()).append("','") + .append(firstData.getWlbh()).append("','") + .append(firstData.getCpxh()).append("','") + .append(firstData.getWlmc()).append("','") + .append(firstData.getTzbh()).append("','") + .append(firstData.getRksl()).append("','") + .append(firstData.getSl()).append("','") + .append(SalaryDateUtil.getFormatLocalDate(firstData.getRq())).append("','") + .append(firstData.getJsxs()).append("','") + .append(firstData.getJsgzcl()).append("')"); + rs.execute(firstSb.toString()); + mzgCpddDataList.remove(0); + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_cpjsgzcl"); + int minId = 0; + if (rs.next()) { + minId = rs.getInt(1); + } + int maxId = minId + mzgCpddDataList.size(); + + List> partition = Lists.partition(mzgCpddDataList, 500); + partition.forEach(part -> { + StringBuilder sb = new StringBuilder(); + sb.append("insert into uf_cpjsgzcl(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,bm,zzzb,scgdh,wlbh,cpxh,wlmc,tzbh,rksl,sl,rq,jsxs,jsgzcl) values "); + for (MzgCpddData data : part) { + sb.append("(") + .append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'") + .append(data.getJournalid()).append("','") + .append(data.getBm()).append("','") + .append(data.getZzzb()).append("','") + .append(data.getScgdh()).append("','") + .append(data.getWlbh()).append("','") + .append(data.getCpxh()).append("','") + .append(data.getWlmc()).append("','") + .append(data.getTzbh()).append("','") + .append(data.getRksl()).append("','") + .append(data.getSl()).append("','") + .append(SalaryDateUtil.getFormatLocalDate(data.getRq())).append("','") + .append(data.getJsxs()).append("','") + .append(data.getJsgzcl()).append("'),"); + } + rs.execute(sb.substring(0,sb.length()-1).toString()); + }); + log.info("产品计算工资产量完成入库"); + log.info("产品计算工资产量开始权限重构minid{},maxid{}",minId,maxId); + // 权限重构 + if (modeId != null && NumberUtils.isCreatable(modeId)) { + Integer modeIdValue = Integer.valueOf(modeId); + for (int i = minId; i <= maxId; i++) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, modeIdValue, i); + } + } + log.info("产品计算工资产量完成权限重构minid{},maxid{}",minId,maxId); + } + } + + @Override + public void generateMzgCpjsgzdj(MzqQueryParam param) { + // 查询产品计算工资产品数据 + Date firstDayDateOfMonth = SalaryDateUtil.getFirstDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth()); + Date lastDayDateOfMonth = SalaryDateUtil.getLastDayDateOfMonthWithMinutesAndSeconds(param.getSalaryMonth()); + log.info("开始生成美之高产品计算工资单价,开始日期{},结束日期{}",firstDayDateOfMonth,lastDayDateOfMonth); + List mzgCpddDataList = getCpddDataByDate(firstDayDateOfMonth, lastDayDateOfMonth); + log.info("产品计算工资产量数据数" + mzgCpddDataList.size()); + if (CollectionUtils.isNotEmpty(mzgCpddDataList)) { + // 获取所有班组基础信息 + List bzInfoList= listAllBzBaseInfoList(); + log.info("获取所有班组基础信息,size:" + bzInfoList.size()); + Map> ksBzMap = SalaryEntityUtil.group2Map(bzInfoList, MzgBzBaseInfo::getKsmc); + List dyzdList = bzInfoList.stream().map(MzgBzBaseInfo::getDyzd).collect(Collectors.toList()); + // 取出所有制造单价表数据 + List> zzdjInfoList = listAllZzdjInfo(dyzdList); + log.info("取出所有制造单价表数据,size:" + zzdjInfoList.size()); + // 取出所有包装单价表数据 + List> bzdjInfoList = listAllBzdjInfo(dyzdList); + log.info("取出所有包装单价表数据,size:" + bzdjInfoList.size()); + // 获取哪些部门属于包装 + BaseBean baseBean = new BaseBean(); + String bzKsNames = baseBean.getPropValue("mzgSalaryReport", "bz_ks_names"); + List bzKsList = new ArrayList<>(); + try { + bzKsList.addAll(Arrays.stream(new String(bzKsNames.getBytes("ISO-8859-1"), "utf-8").split(",")).collect(Collectors.toList())); + } catch (UnsupportedEncodingException e) { + log.error("获取包装科室出错" + e); + } + + String currDate = String.format("'%s'", TimeUtil.getCurrentDateString()); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String currTime = String.format("'%s'", sdf.format(new Date())); + // 获取建模模块id + String modeId = baseBean.getPropValue("mzgSalaryReport", "cpjsgzdj_mode_id"); + RecordSet rs = new RecordSet(); + int minId = 0; + int maxId = 0; + for (int i = 0; i < mzgCpddDataList.size(); i++ ) { + MzgCpddData cpddData = mzgCpddDataList.get(i); + String ks = cpddData.getBm(); + String zzzb = cpddData.getZzzb(); + // 获取该笔订单的部门,获取有那些班组 + List bzList = ksBzMap.get(cpddData.getBm()); + // 判断是否需要根据制作组别判断 + if (StringUtils.isNotBlank(zzzb) && !(zzzb.equals(ks))) { + bzList = bzList.stream().filter(bz -> bz.getBzmc().equals(zzzb)).collect(Collectors.toList()); + } + // 判断是包装还是制造 + Map djInfoMap = new HashMap<>(); + if (bzKsList.contains(ks)) { + // 是包装科室,从包装表根据产品型号匹配 + String cpxh = cpddData.getCpxh(); + List> djInfoList = bzdjInfoList.stream().filter(map -> + StringUtils.isNotBlank(map.get("cpxh")) && cpxh.equals(map.get("cpxh")) + ).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(djInfoList)) { + djInfoMap = djInfoList.get(0); + } + } else { + // 是制造科室,从制造表根据图纸编号匹配 + String tzbh = cpddData.getTzbh(); + List> djInfoList = zzdjInfoList.stream().filter(map -> + StringUtils.isNotBlank(map.get("tzbh")) && tzbh.equals(map.get("tzbh")) + ).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(djInfoList)) { + djInfoMap = djInfoList.get(0); + } + } + // 获取所有班组对应的单价*计算工资产量 + Double jsgzclValue = NumberUtils.isCreatable(cpddData.getJsgzcl()) ? Double.valueOf(cpddData.getJsgzcl()) : new Double(0);; + Map gzdjValueMap = new HashMap<>(); + for (MzgBzBaseInfo bz : bzList) { + Double djValue = NumberUtils.isCreatable(djInfoMap.get(bz.getDyzd())) ? Double.valueOf(djInfoMap.get(bz.getDyzd())) : new Double(0); + double value = jsgzclValue * djValue; + gzdjValueMap.put(bz.getDyzd(), String.valueOf(value)); + } + cpddData.setValueMap(gzdjValueMap); + + // 入库并权限重构 + if (i == 0){ + // 入库前先删除 + String deleteSql = "delete from uf_cpjsgzdj where rq >=? and rq <= ?"; + rs.executeUpdate(deleteSql, new Object[]{SalaryDateUtil.getFormatLocalDate(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDate(lastDayDateOfMonth)}); + // 先插入一条数据 + StringBuilder firstSb = new StringBuilder(); + firstSb.append("insert into uf_cpjsgzdj(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,rq,wlbh,mc,cpxh,gg,tzbh"); + for (MzgBzBaseInfo bz : bzList) { + firstSb.append(","); + firstSb.append(bz.getDyzd()); + } + firstSb.append(") values ("); + firstSb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'") + .append(cpddData.getJournalid()).append("','") + .append(SalaryDateUtil.getFormatLocalDate(cpddData.getRq())).append("','") + .append(Utils.null2String(cpddData.getWlbh())).append("','") + .append(Utils.null2String(djInfoMap.get("mc"))).append("','") + .append(Utils.null2String(cpddData.getCpxh())).append("','") + .append(Utils.null2String(djInfoMap.get("gg"))).append("','") + .append(Utils.null2String(cpddData.getTzbh())).append("'"); + for (MzgBzBaseInfo bz : bzList) { + firstSb.append(","); + firstSb.append(gzdjValueMap.get(bz.getDyzd()) == null ? "0" : gzdjValueMap.get(bz.getDyzd())); + } + firstSb.append(")"); + rs.execute(firstSb.toString()); + // 获取最大值 作为权限重构的起始id + rs.execute("select max(id) from uf_cpjsgzdj"); + if (rs.next()) { + minId = rs.getInt(1); + } + maxId = minId; + } else { + ++maxId; + StringBuilder sb = new StringBuilder(); + sb.append("insert into uf_cpjsgzdj(formmodeid,modedatacreater,modedatacreatertype,modedatacreatedate,modedatacreatetime,journalid,rq,wlbh,mc,cpxh,gg,tzbh"); + for (MzgBzBaseInfo bz : bzList) { + sb.append(","); + sb.append(bz.getDyzd()); + } + sb.append(") values ("); + sb.append(modeId).append(",1,0,").append(currDate).append(",").append(currTime).append(",'") + .append(cpddData.getJournalid()).append("','") + .append(SalaryDateUtil.getFormatLocalDate(cpddData.getRq())).append("','") + .append(Utils.null2String(cpddData.getWlbh())).append("','") + .append(Utils.null2String(djInfoMap.get("mc"))).append("','") + .append(Utils.null2String(cpddData.getCpxh())).append("','") + .append(Utils.null2String(djInfoMap.get("gg"))).append("','") + .append(Utils.null2String(cpddData.getTzbh())).append("'"); + for (MzgBzBaseInfo bz : bzList) { + sb.append(","); + sb.append(gzdjValueMap.get(bz.getDyzd()) == null ? "0" : gzdjValueMap.get(bz.getDyzd())); + } + sb.append(")"); + rs.execute(sb.toString()); + } + } + // 权限重构 + log.info("产品计算工资单价开始权限重构minid{},maxid{}",minId,maxId); + if (modeId != null && NumberUtils.isCreatable(modeId)) { + Integer modeIdValue = Integer.valueOf(modeId); + for (int i = minId; i <= maxId; i++) { + ModeRightInfo ModeRightInfo = new ModeRightInfo(); + ModeRightInfo.setNewRight(true); + ModeRightInfo.editModeDataShare(1, modeIdValue, i); + } + } + log.info("产品计算工资单价完成权限重构minid{},maxid{}",minId,maxId); + + } + } + + + /** + * 获取美之高erp产品订单数据 + * @param firstDayDateOfMonth + * @param lastDayDateOfMonth + * @return + */ + private List getERPCpddDataByDate(Date firstDayDateOfMonth, Date lastDayDateOfMonth) { + // 获取erp中产品订单表数据 + BaseBean baseBean = new BaseBean(); + String dataSource = baseBean.getPropValue("mzgSalaryReport", "erp_datasource_name"); + RecordSetDataSource erpRs = new RecordSetDataSource(dataSource); + String sql = "select a.JOURNALID,d.ProdPoolId 部门,case when d.ProdPoolId ='包二课' then IWS_MakeUpTypeId else d.ProdPoolId end 制作组别,b.ProdId 生产工单号, " + + " b.IWS_ItemId 物料编号,d.IWS_Spec 产品型号,d.Name 物料名称,d.IWS_DrawingId 图纸编号, b.QtyGood 入库数量,d.QtySched 数量, b.TransDate 日期 " + + "from ProdJournalTable a,ProdJournalProd b,INVENTDIM c,prodtable d " + + "where a.JOURNALID=b.JOURNALID and a.DATAAREAID ='mg' and b.DATAAREAID ='mg' and c.DATAAREAID ='all' " + + "and a.JournalNameId in ('Finish') and c.INVENTLOCATIONID not like '%xb' " + + "and b.INVENTDIMID =c.INVENTDIMID and a.POSTED =1 and b.QtyGood<>0 " + + "and d.DATAAREAID ='mg' and d.prodid=b.prodid and d.ProdPoolId NOT in ('开发课','模具课','下料课','外协') " + + "and b.TransDate >=? and b.TransDate <= ? order by b.TransDate desc"; + erpRs.executeQueryWithDatasource(sql, dataSource, new Object[]{SalaryDateUtil.getFormatLocalDateTime(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDateTime(lastDayDateOfMonth)}); + List mzgCpddDataList = new ArrayList<>(); + while (erpRs.next()) { + mzgCpddDataList.add(MzgCpddData.builder() + .journalid(erpRs.getString("JOURNALID")) + .bm(erpRs.getString("部门")) + .zzzb(erpRs.getString("制作组别")) + .scgdh(erpRs.getString("生产工单号")) + .wlbh(erpRs.getString("物料编号")) + .cpxh(erpRs.getString("产品型号")) + .wlmc(erpRs.getString("物料名称")) + .tzbh(erpRs.getString("图纸编号")) + .rksl(erpRs.getString("入库数量")) + .sl(erpRs.getString("数量")) + .rq(SalaryDateUtil.stringToDate(erpRs.getString("日期"))) + .build()); + } + return mzgCpddDataList; + } + + + /** + * 获取美之高部门对应系数规则配置 + * @return + */ + private Map getMzgBmdyxsMap() { + RecordSet rs = new RecordSet(); + String sql = "select sjbm,gs from uf_bmdyxsb" ; + rs.execute(sql); + Map resultMap = new HashMap<>(); + while (rs.next()) { + ExpressFormula formula = ExpressFormula.builder() + .formula("formula") + .extendParam("{\"isCustomFunction\":\"0\",\"sqlReturnKey\":\"\",\"openDecrypt\":\"0\",\"datasource\":{\"datasourceId\":\"\"}}") + .formulaRunScript(rs.getString("gs")) + .referenceType(ReferenceTypeEnum.FORMULA.getValue()) + .build(); + resultMap.put(rs.getString("sjbm"), formula); + } + return resultMap; + } + + + /** + * 获取美之高建模产品订单数据 + * @param firstDayDateOfMonth + * @param lastDayDateOfMonth + * @return + */ + private List getCpddDataByDate(Date firstDayDateOfMonth, Date lastDayDateOfMonth) { + // 获取产品订单表数据 + RecordSet rs = new RecordSet(); + String sql = "select journalid,bm,zzzb,scgdh,wlbh,cpxh,wlmc,tzbh,rksl,sl,rq,jsxs,jsgzcl from uf_cpjsgzcl where rq >=? and rq <= ? order by rq desc"; + rs.executeQuery(sql, new Object[]{SalaryDateUtil.getFormatLocalDate(firstDayDateOfMonth), SalaryDateUtil.getFormatLocalDate(lastDayDateOfMonth)}); + List mzgCpddDataList = new ArrayList<>(); + while (rs.next()) { + mzgCpddDataList.add(MzgCpddData.builder() + .journalid(rs.getString(1)) + .bm(rs.getString(2)) + .zzzb(rs.getString(3)) + .scgdh(rs.getString(4)) + .wlbh(rs.getString(5)) + .cpxh(rs.getString(6)) + .wlmc(rs.getString(7)) + .tzbh(rs.getString(8)) + .rksl(rs.getString(9)) + .sl(rs.getString(10)) + .rq(SalaryDateUtil.stringToDate(rs.getString(11))) + .jsxs(rs.getString(12)) + .jsgzcl(rs.getString(13)) + .build()); + } + return mzgCpddDataList; + } + + /** + * 获取美之高所有班组基础信息 + * @return + */ + private List listAllBzBaseInfoList() { + List resultList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + rs.execute("select dyzd,ksmc,bzmc from uf_bzjcb"); + while (rs.next()) { + resultList.add(MzgBzBaseInfo.builder() + .dyzd(rs.getString("dyzd")) + .ksmc(rs.getString("ksmc")) + .bzmc(rs.getString("bzmc")) + .build()); + } + return resultList; + } + + /** + * 美之高 取出所有制造单价表数据 + * @param dyzdList + * @return + */ + private List> listAllZzdjInfo(List dyzdList) { + List> resultList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + String fieldStr = StringUtils.join(dyzdList, ","); + String sql ="select wlbh,mc,cpxh,gg,tzbh,"+fieldStr+" from uf_zzcpdjb"; + rs.execute(sql); + while (rs.next()) { + Map singleValueMap = new HashMap<>(); + singleValueMap.put("wlbh", rs.getString("wlbh")); + singleValueMap.put("mc", rs.getString("mc")); + singleValueMap.put("cpxh", rs.getString("cpxh")); + singleValueMap.put("gg", rs.getString("gg")); + singleValueMap.put("tzbh", rs.getString("tzbh")); + for (String zd : dyzdList) { + singleValueMap.put(zd, rs.getString(zd)); + } + resultList.add(singleValueMap); + } + return resultList; + } + + /** + * 美之高 取出所有包装单价表数据 + * @param dyzdList + * @return + */ + private List> listAllBzdjInfo(List dyzdList) { + List> resultList = new ArrayList<>(); + RecordSet rs = new RecordSet(); + String fieldStr = StringUtils.join(dyzdList, ","); + String sql ="select wlbh,mc,cpxh,gg,tzbh,"+fieldStr+" from uf_cpdjbbz"; + rs.execute(sql); + while (rs.next()) { + Map singleValueMap = new HashMap<>(); + singleValueMap.put("wlbh", rs.getString("wlbh")); + singleValueMap.put("mc", rs.getString("mc")); + singleValueMap.put("cpxh", rs.getString("cpxh")); + singleValueMap.put("gg", rs.getString("gg")); + singleValueMap.put("tzbh", rs.getString("tzbh")); + for (String zd : dyzdList) { + singleValueMap.put(zd, rs.getString(zd)); + } + resultList.add(singleValueMap); + } + return resultList; + } + } \ No newline at end of file diff --git a/src/com/engine/salary/timer/AutoSyncMzgCpjsgzcl.java b/src/com/engine/salary/timer/AutoSyncMzgCpjsgzcl.java new file mode 100644 index 000000000..84824642b --- /dev/null +++ b/src/com/engine/salary/timer/AutoSyncMzgCpjsgzcl.java @@ -0,0 +1,52 @@ +package com.engine.salary.timer; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryacct.param.MzqQueryParam; +import com.engine.salary.service.SalaryAcctResultService; +import com.engine.salary.service.impl.SalaryAcctResultServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.time.LocalDate; +import java.util.Date; + +/** + * @author Harryxzy + * @ClassName AutoSyncAttendQuoteData + * @date 2023/08/11 9:53 + * @description 自动生成 美之高产品计算工资产量 + */ +public class AutoSyncMzgCpjsgzcl extends BaseCronJob { + + private String preMonth; + + private String salaryMonth; + + private SalaryAcctResultService getSalaryAcctResultService(User user) { + return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); + } + + + @Override + public void execute() { + User tempUser = new User(); + tempUser.setUid(1); + tempUser.setLoginid("sysadmin"); + LocalDate localDate = SalaryDateUtil.dateToLocalDate(new Date()); + + int preMonthValue = -1; + if (preMonth != null && NumberUtils.isCreatable(preMonth)) { + preMonthValue = -1 * Integer.valueOf(preMonth); + } + localDate = localDate.plusMonths(preMonthValue); + Date date = SalaryDateUtil.localDateToDate(localDate); + if (StringUtils.isNotBlank(salaryMonth) && SalaryDateUtil.checkYearMonth(salaryMonth)) { + date = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + } + MzqQueryParam param = MzqQueryParam.builder().salaryMonth(date).build(); + getSalaryAcctResultService(tempUser).generateMzgCpjsgzcl(param); + } +} diff --git a/src/com/engine/salary/timer/AutoSyncMzgCpjsgzdj.java b/src/com/engine/salary/timer/AutoSyncMzgCpjsgzdj.java new file mode 100644 index 000000000..f2a311e13 --- /dev/null +++ b/src/com/engine/salary/timer/AutoSyncMzgCpjsgzdj.java @@ -0,0 +1,52 @@ +package com.engine.salary.timer; + +import com.engine.common.util.ServiceUtil; +import com.engine.salary.entity.salaryacct.param.MzqQueryParam; +import com.engine.salary.service.SalaryAcctResultService; +import com.engine.salary.service.impl.SalaryAcctResultServiceImpl; +import com.engine.salary.util.SalaryDateUtil; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import weaver.hrm.User; +import weaver.interfaces.schedule.BaseCronJob; + +import java.time.LocalDate; +import java.util.Date; + +/** + * @author Harryxzy + * @ClassName AutoSyncAttendQuoteData + * @date 2023/08/11 9:53 + * @description 自动生成 美之高产品计算工资单价 + */ +public class AutoSyncMzgCpjsgzdj extends BaseCronJob { + + private String preMonth; + + private String salaryMonth; + + private SalaryAcctResultService getSalaryAcctResultService(User user) { + return ServiceUtil.getService(SalaryAcctResultServiceImpl.class, user); + } + + + @Override + public void execute() { + User tempUser = new User(); + tempUser.setUid(1); + tempUser.setLoginid("sysadmin"); + LocalDate localDate = SalaryDateUtil.dateToLocalDate(new Date()); + + int preMonthValue = -1; + if (preMonth != null && NumberUtils.isCreatable(preMonth)) { + preMonthValue = -1 * Integer.valueOf(preMonth); + } + localDate = localDate.plusMonths(preMonthValue); + Date date = SalaryDateUtil.localDateToDate(localDate); + if (StringUtils.isNotBlank(salaryMonth) && SalaryDateUtil.checkYearMonth(salaryMonth)) { + date = SalaryDateUtil.dateStrToLocalYearMonth(salaryMonth); + } + MzqQueryParam param = MzqQueryParam.builder().salaryMonth(date).build(); + getSalaryAcctResultService(tempUser).generateMzgCpjsgzdj(param); + } +} diff --git a/src/com/engine/salary/util/SalaryDateUtil.java b/src/com/engine/salary/util/SalaryDateUtil.java index 09983dd1f..739c37d71 100644 --- a/src/com/engine/salary/util/SalaryDateUtil.java +++ b/src/com/engine/salary/util/SalaryDateUtil.java @@ -276,6 +276,18 @@ public class SalaryDateUtil { return cal.getTime(); } + public static Date getLastDayDateOfMonthWithMinutesAndSeconds(final Date date) { + final Calendar cal = Calendar.getInstance(); + cal.setTime(date); + final int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH); + cal.set(Calendar.DAY_OF_MONTH, last); + cal.set(Calendar.HOUR_OF_DAY, cal.getActualMaximum(Calendar.HOUR_OF_DAY)); + cal.set(Calendar.MINUTE, cal.getActualMaximum(Calendar.MINUTE)); + cal.set(Calendar.SECOND, cal.getActualMaximum(Calendar.SECOND)); + cal.set(Calendar.MILLISECOND, cal.getActualMaximum(Calendar.MILLISECOND)); + return cal.getTime(); + } + public static Date getLastDayOfMonth(final Date date) { final Calendar cal = Calendar.getInstance(); cal.setTime(date); diff --git a/src/com/engine/salary/web/SalaryAcctController.java b/src/com/engine/salary/web/SalaryAcctController.java index a196d53ef..aae31afc5 100644 --- a/src/com/engine/salary/web/SalaryAcctController.java +++ b/src/com/engine/salary/web/SalaryAcctController.java @@ -928,4 +928,26 @@ public class SalaryAcctController { } /**********************************线下对比 end*********************************/ + + // 生成美之高产品计算工资产量 + @POST + @Path("/generate/mzgCpjsgzcl") + @Produces(MediaType.APPLICATION_JSON) + public String generateMzgCpjsgzcl(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody MzqQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::generateMzgCpjsgzcl, param); + } + + + // 生成美之高产品计算工资单价 + @POST + @Path("/generate/mzgCpjsgzdj") + @Produces(MediaType.APPLICATION_JSON) + public String generateMzgCpjsgzdj(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody MzqQueryParam param) { + User user = HrmUserVarify.getUser(request, response); + return new ResponseResult>(user).run(getSalaryAcctResultWrapper(user)::generateMzgCpjsgzdj, param); + } + + + } diff --git a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java index 097092b2e..6260126a1 100644 --- a/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java +++ b/src/com/engine/salary/wrapper/SalaryAcctResultWrapper.java @@ -279,6 +279,15 @@ public class SalaryAcctResultWrapper extends Service implements SalaryAcctResult getSalaryAcctResultService(user).batchUpdate(param); } + @Override + public void generateMzgCpjsgzcl(MzqQueryParam param) { + getSalaryAcctResultService(user).generateMzgCpjsgzcl(param); + } + + public void generateMzgCpjsgzdj(MzqQueryParam param) { + getSalaryAcctResultService(user).generateMzgCpjsgzdj(param); + } + /** * 薪资核算-校验 * diff --git a/src/com/engine/salary/wrapper/proxy/SalaryAcctResultWrapperProxy.java b/src/com/engine/salary/wrapper/proxy/SalaryAcctResultWrapperProxy.java index 7a984d1c4..5b71a1277 100644 --- a/src/com/engine/salary/wrapper/proxy/SalaryAcctResultWrapperProxy.java +++ b/src/com/engine/salary/wrapper/proxy/SalaryAcctResultWrapperProxy.java @@ -20,4 +20,6 @@ public interface SalaryAcctResultWrapperProxy { void calculate(SalaryAcctCalculateParam calculateParam); void batchUpdate(SalaryAcctResultBatchUpdateParam param); + + void generateMzgCpjsgzcl(MzqQueryParam param); }