qingwu 1 месяц назад
Родитель
Сommit
ed270a1eb5

+ 299 - 0
websrc/com/kingdee/eas/custom/ssPDF/handler/CmpReportDynamicListHandlerTowEx.java

@@ -0,0 +1,299 @@
+package com.kingdee.eas.custom.ssPDF.handler;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.web.dynamic.util.DynamicUtil;
+import com.kingdee.shr.base.syssetting.web.dynamic.util.MD5;
+import com.kingdee.shr.base.syssetting.web.util.UserUtil;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.math.BigDecimal;
+import java.sql.Date;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 青梧
+ * @version 1.0
+ * @description: 员工信息查询  txt文件下载
+ * @date 2025/11/14 10:53
+ */
+public class CmpReportDynamicListHandlerTowEx extends CmpReportDynamicListHandlerEx {
+    private static final Logger logger = LoggerFactory.getLogger(CmpReportDynamicListHandlerTowEx.class);
+    Context ctx = SHRContext.getInstance().getContext();//上下文
+
+    /***
+     *
+     * @param request
+     * @param response
+     * @param modelMap
+     * @throws SHRWebException
+     */
+    public void txtDownloadAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
+        String adminOrgId = request.getParameter("adminOrgId");
+        String year = request.getParameter("year");
+        String sql = getSql(adminOrgId, year);
+        logger.error("sql---" + sql);
+        JSONArray jsonArray = new JSONArray();
+        Map map = new HashMap();
+        try {
+            IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
+            while (iRowSet.next()) {
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("personId", iRowSet.getString("personId"));
+                jsonObject.put("ctbMonth", iRowSet.getString("periodMonth"));
+                jsonObject.put("calNumber", iRowSet.getString("calSchemeNumber"));
+                jsonObject.put("ctbPeriodyear", year);
+                jsonArray.add(jsonObject);
+            }
+            long time = System.currentTimeMillis();
+            HttpSession session = request.getSession();
+            String tempFilePath = UserUtil.getUserTempDirAbsolutePath(session); //存放
+            File tempFile = new File(tempFilePath);
+            if (!tempFile.exists()) {
+                tempFile.mkdirs();
+            }
+            // 创建 FileWriter 对象来写入文本文件
+            String fileName = "output_" + time + ".txt";
+            String txtNameHash = MD5.md5Hash(fileName);
+            String realFileName = getEncryRealFileName(ctx, txtNameHash);
+            String txtPath = tempFilePath + File.separator + realFileName;
+            String fileStr = txtNameHash;
+            FileWriter fileWriter = new FileWriter(txtPath);
+            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+                String personId = (String) jsonObject.get("personId");
+                String ctbPeriodyear = String.valueOf(jsonObject.get("ctbPeriodyear"));//
+                String ctbMonth = String.valueOf(jsonObject.get("ctbMonth"));
+                String calNumber = (String) jsonObject.get("calNumber");//规则名称
+                String dataTxt = getSql(ctx, personId, ctbPeriodyear, ctbMonth, calNumber);
+                bufferedWriter.write(dataTxt);
+            }
+            // 关闭 BufferedWriter
+            bufferedWriter.close();
+            // 关闭 FileWriter
+            fileWriter.close();
+
+            Map<String, String> param = new HashMap<String, String>();
+            param.put("method", "tmp");
+            param.put("file", fileStr);
+            param.put("filename", fileName);
+            String link = DynamicUtil.assembleUrl("/shr/downloadfile.do", param).replaceAll("\\+", "%20");
+            map.put("msgType", "1");
+            map.put("link", link);
+            map.put("msg", "下载成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("msg", e.getMessage());
+            map.put("msgType", "0");
+        }
+
+        this.writeSuccessData(map);
+
+        //String personId = (String) jsonObject.get("personId");
+        //String ctbPeriodyear = String.valueOf(jsonObject.get("ctbPeriodyear"));//
+        //String ctbMonth = String.valueOf(jsonObject.get("ctbMonth"));
+        //String calNumber = (String) jsonObject.get("calNumber");//规则名称
+
+    }
+
+    ///**
+    // * 获取sql语句
+    // *
+    // * @param adminOrgId
+    // * @param year
+    // * @return
+    // */
+    //public String getSql(String adminOrgId, String year) {
+    //    StringBuilder sb = new StringBuilder();
+    //    sb.append("SELECT ").append("\n");
+    //    sb.append("    cmpCalTable.FPersonID as personId,").append("\n");
+    //    sb.append("    calScheme.fnumber as calSchemeNumber ,").append("\n");
+    //    sb.append("    MAX(cmpCalTable.FPeriodMonth) as periodMonth").append("\n");
+    //    sb.append("FROM T_HR_SCmpCalTable cmpCalTable").append("\n");
+    //    sb.append("INNER JOIN T_HR_SCalScheme calScheme ON calScheme.fid = cmpCalTable.FCalSchemeID").append("\n");
+    //    sb.append("WHERE cmpCalTable.FPeriodYear = '" + year + "'   ").append("\n");
+    //    sb.append("  AND cmpCalTable.FAdminOrgUnitID = '" + adminOrgId + "'").append("\n");
+    //    sb.append("  AND calScheme.fnumber IS NOT NULL").append("\n");
+    //    sb.append("GROUP BY cmpCalTable.FPersonID, calScheme.fnumber").append("\n");
+    //    sb.append("ORDER BY MAX(cmpCalTable.FPeriodMonth) DESC;").append("\n");
+    //    return sb.toString();
+    //}
+
+    /**
+     * 获取sql语句
+     *
+     * @param adminOrgId
+     * @param year
+     * @return
+     */
+    public String getSql(String adminOrgId, String year) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("SELECT ").append("\n");
+        sb.append("    cmpCalTable.FPersonID as personId,").append("\n");
+        sb.append("    calScheme.fnumber as calSchemeNumber ,").append("\n");
+        sb.append("    MAX(cmpCalTable.FPeriodMonth) as periodMonth").append("\n");
+        sb.append("FROM T_HR_SCmpCalTable cmpCalTable").append("\n");
+        sb.append("INNER JOIN T_HR_SCalScheme calScheme ON calScheme.fid = cmpCalTable.FCalSchemeID").append("\n");
+        sb.append("WHERE cmpCalTable.FPeriodYear = '" + year + "'   ").append("\n");
+        sb.append("  AND cmpCalTable.FAdminOrgUnitID in").append("\n");
+        sb.append("(").append("\n");
+        sb.append("select child.fid from T_ORG_Admin adcount ").append("\n");
+        sb.append("left join T_ORG_Admin child on (charindex(concat(adcount.flongnumber,'!'),child.flongnumber) = 1 or adcount.flongnumber = child.flongnumber)").append("\n");
+        sb.append("where  adcount.fid = '" + adminOrgId + "'").append("\n");
+        sb.append(")").append("\n");
+        sb.append("  AND calScheme.fnumber IS NOT NULL").append("\n");
+        sb.append("GROUP BY cmpCalTable.FPersonID, calScheme.fnumber").append("\n");
+        sb.append("ORDER BY MAX(cmpCalTable.FPeriodMonth) DESC;").append("\n");
+        return sb.toString();
+    }
+
+    /**
+     * @param personId
+     * @param ctbPeriodyear 统计年
+     * @param ctbMonth      统计月
+     * @param calNumber     计算规则
+     */
+    public String getSql(Context ctx, String personId, String ctbPeriodyear, String ctbMonth, String calNumber) throws Exception {
+        SimpleDateFormat outputFormatter = new SimpleDateFormat("ddMMyyyy");
+        StringBuilder query = new StringBuilder();
+        query.append("SELECT").append("\n");
+        query.append("org.Fname_l2 orgName,").append("\n");
+        query.append("org.FCode as orgCode,").append("\n");
+        query.append("person.CFOccupationcode personOccTion,").append("\n");
+        query.append("person.CFChinesesurname personChineX,").append("\n");
+        query.append("person.CFChinesename personChineM,").append("\n");
+        query.append("person.CFPortuguesesurname personPX,").append("\n");
+        query.append("person.CFPortuguesename personPM,").append("\n");
+        query.append("sc.S5 s5,").append("\n");
+        query.append("sc.S94  s93,").append("\n");
+        query.append("res.FBIZDATE bizDate ,").append("\n");
+        query.append("bill.FBILLSTATE  status ").append("\n");
+        query.append("FROM T_HR_SCmpCalTable sc ").append("\n");
+        query.append("left join T_HR_SCalScheme ch on sc.FCALSCHEMEID = ch.fid").append("\n");
+        query.append("left join t_hr_personposition pp on sc.FPERSONID = pp.FPERSONID ").append("\n");
+        query.append("left join T_BD_PERSON person on pp.FPERSONID = person.fid ").append("\n");
+        query.append("left join T_Org_admin org on org.fid = pp.FCOMPANYID").append("\n");
+        query.append("left join T_HR_ResignBizBillEntry res on res.FPERSONID = person.fid").append("\n");
+        query.append("left join T_HR_ResignBizBill bill on bill.fid = res.FBILLID \n").append("\n");
+        query.append("where sc.FPERSONID = '" + personId + "' and sc.FPERIODYEAR = '" + ctbPeriodyear + "' and sc.FPERIODMONTH = '" + ctbMonth + "' and ch.FNumber  = '" + calNumber + "'").append("\n");
+        logger.error("query---" + query.toString());
+        IRowSet rowSet = DbUtil.executeQuery(ctx, query.toString());
+        String orgCode = "";//雇主编号
+        String taxFile = "";//营业税档案编号或僱主编号文字部份
+
+        String clauseNumber = "32";//职业税条款编号
+        String personOccTion = "";
+        String ChineName = "";
+        String ChinePWName = "";
+        String s5Str = "";
+        String nonMonetary = "";//若有接受非金錢收益
+        String notTaxable = "";//不属课税收益
+        String s93Str = "";
+        String leftStr = "";
+        String txt01 = "01";
+        String txt02 = "12";
+        String reserved = "";
+        while (rowSet.next()) {
+            //orgName = rowSet.getString("orgName");
+            orgCode = rowSet.getString("orgCode");//雇主编号
+            personOccTion = rowSet.getString("personOccTion") == null ? "" : rowSet.getString("personOccTion");//税务编码
+            String personChineX = rowSet.getString("personChineX") == null ? "" : rowSet.getString("personChineX");//中文姓
+            String personChineM = rowSet.getString("personChineM") == null ? "" : rowSet.getString("personChineM");//中文名
+            String personPX = rowSet.getString("personPX") == null ? "" : rowSet.getString("personPX");//葡文姓
+            String personPM = rowSet.getString("personPM") == null ? "" : rowSet.getString("personPM");//葡文名
+            String status = rowSet.getString("status") == null ? "" : rowSet.getString("status");//单据状态
+            BigDecimal s5 = rowSet.getBigDecimal("s5");//应纳税所得额
+            BigDecimal s93 = rowSet.getBigDecimal("s93");  //測試環境 93  职业税s94
+            logger.error("s5---" + s5);
+            logger.error("s93---" + s93);
+            Date bizDate = rowSet.getDate("bizDate");//员工离职日期
+            if (bizDate != null) {
+                leftStr = outputFormatter.format(bizDate);
+                if (!status.equals("3")) {
+                    continue;
+                }
+            }
+            String[] s5split = convertToString(s5).split("\\.");
+            String strS5 = s5split[0];
+            if (StringUtils.isNotBlank(strS5)) {
+//                if (convertToBigDecimal(strS5).compareTo(BigDecimal.ZERO) > 0){
+                s5Str += strLengthReturn(strS5, 11, "0", 0);
+//                }
+            }
+            if (s5split.length > 1) {
+                s5Str += s5split[1];
+
+            } else {
+                s5Str += "00";
+            }
+
+
+            String[] s93split = convertToString(s93).split("\\.");
+            String strS93 = s93split[0];
+            if (StringUtils.isNotBlank(strS93)) {
+//                if (convertToBigDecimal(strS93).compareTo(BigDecimal.ZERO) > 0){
+                s93Str += strLengthReturn(strS93, 11, "0", 0);
+//                }
+            }
+            if (s93split.length > 1) {
+                s93Str += s93split[1];
+            } else {
+                s93Str += "00";
+            }
+            /**
+             * 员工对应组织 的 雇主编号 --7
+             * 营业税档案编号或僱主编号文字部份  空  --1
+             * 员工查询界面 统计年  --4
+             * 职业税条款编号 默认 32  --2
+             * 员工信息--税务编码  --8
+             * 员工信息--中文姓名 (Big-5編碼)  --40
+             * 员工信息--葡文姓名  --40
+             * 薪酬核算--应纳税所得额  --13
+             * 若有接受非金钱收益 空  --1
+             * 不属课税收益  空  --13
+             * 薪酬核算--职业税  --13
+             * 员工离职日期  --8
+             * 默认 01  --2
+             * 默认 12  --2
+             * 预留供日后使用 空  --20
+             */
+            ChineName = stringToBig5Bytes(personChineX + personChineM);
+            ChinePWName = personPX + personPM;
+            orgCode = strLengthReturn(orgCode, 7, "0", 0);//雇主编号
+            taxFile = strLengthReturn("", 1, " ", 0);//营业税档案编号或僱主编号文字部份
+
+
+            personOccTion = strLengthReturn(personOccTion, 8, " ", personOccTion.length());//税务编码
+            ChineName = strLengthReturn(ChineName, 40, " ", ChineName.length());//中文姓名
+            ChinePWName = strLengthReturn(ChinePWName, 40, " ", ChinePWName.length());//葡文姓名
+            //s5 = strLengthReturn(removeTrailingZeros(s5),13,"0",0);//应纳税所得额
+            nonMonetary = strLengthReturn("", 1, " ", 0);//若有接受非金錢收益
+            notTaxable = strLengthReturn("", 13, "0", 0);//不属课税收益
+            //s93 = strLengthReturn(removeTrailingZeros(s93),13,"0",0);//职业税
+            leftStr = strLengthReturn(leftStr, 8, " ", leftStr.length());//员工离职日期
+
+
+            reserved = strLengthReturn("", 20, " ", 0);//预留供日后使用
+
+        }
+
+        return orgCode + taxFile + ctbPeriodyear + clauseNumber + personOccTion + ChineName + ChinePWName + s5Str + nonMonetary + notTaxable + s93Str + leftStr + txt01 + txt02 + reserved + "\n";
+    }
+}