kimi
2020-11-27 75c32d6d697a550400d0b4eec95b8570d83b726f
src/main/java/com/highdatas/srs/web/SchemeController.java
@@ -11,10 +11,7 @@
import com.highdatas.srs.entity.*;
import com.highdatas.srs.pojo.CodeMsg;
import com.highdatas.srs.pojo.Result;
import com.highdatas.srs.service.IProjectDealService;
import com.highdatas.srs.service.ISchemeDetailService;
import com.highdatas.srs.service.ISchemeService;
import com.highdatas.srs.service.ISysUserService;
import com.highdatas.srs.service.*;
import com.highdatas.srs.util.DbUtils;
import com.highdatas.srs.util.FileUtils;
import org.apache.commons.lang3.StringUtils;
@@ -26,9 +23,11 @@
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.IntFunction;
/**
 * <p>
@@ -49,9 +48,310 @@
    ISchemeDetailService iSchemeDetailService;
    @Autowired
    IProjectDealService projectDealService;
    @Autowired
    ISysRoleMappingService roleMappingService;
    @Autowired
    ISysRoleService roleService;
    @Autowired
    ISchemeDetailParttimeService detailParttimeService;
    @Autowired
    ISysTargetService targetService;
    @Value("${base.file.path}")
    String basePath;
    @RequestMapping(value = "/achieve", method = RequestMethod.GET)
    public Result getAcheve(@RequestParam String type,  HttpServletRequest request) throws ParseException {
        EntityWrapper<Scheme> schemeEntityWrapper = new EntityWrapper<>();
        //编辑  取消 不计入
        schemeEntityWrapper.notIn("status", "edit");
        List<Scheme> schemes = schemeService.selectList(schemeEntityWrapper);
        List<SchemeDetail> detailList = new ArrayList<>();
        for (Scheme scheme : schemes) {
            String id = scheme.getId();
            EntityWrapper<SchemeDetail> schemeDetailEntityWrapper = new EntityWrapper<>();
            schemeDetailEntityWrapper.eq("parent_id", id);
            List<SchemeDetail> schemeDetails = iSchemeDetailService.selectList(schemeDetailEntityWrapper);
            detailList.addAll(schemeDetails);
        }
        if (type.equalsIgnoreCase("total")) {
                Result result = getTotalOptions(detailList);
        }else if (type.equalsIgnoreCase("per")) {
                Result result = getPerOptions(detailList);
        }else if (type.equalsIgnoreCase("after")) {
                Result result = getAfterOptions(detailList);
        }else if(type.equalsIgnoreCase("month")) {
                Result result = getMonthOptions(detailList);
        }else if(type.equalsIgnoreCase("team")) {
                Result result = getTeamOptions(detailList);
        }else if(type.equalsIgnoreCase("member")) {
                Result result = getTeamOptions(detailList);
        }
        return  Result.success(null);
    }
    private Result getTeamOptions(List<SchemeDetail> detailList) {
        return  null;
    }
    private Result getMonthOptions(List<SchemeDetail> detailList) throws ParseException {
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        JSONObject resultData = new JSONObject();
        List<String> months = new ArrayList<>();
        List<String> types = new ArrayList<>();
        types.add("指标");
        types.add("完成");
        types.add("达成率");
        List<JSONObject> datas = new ArrayList<>();
        JSONObject targetDataObject = new JSONObject();
        targetDataObject.put("name", "指标");
        targetDataObject.put("type", "bar");
        datas.add(targetDataObject);
        JSONObject amountDataObject = new JSONObject();
        amountDataObject.put("name", "完成");
        amountDataObject.put("type", "bar");
        datas.add(amountDataObject);
        JSONObject achieveDataObject = new JSONObject();
        achieveDataObject.put("name", "达成率");
        achieveDataObject.put("type", "line");
        datas.add(achieveDataObject);
        List<JSONObject> entityset = new ArrayList<>();
        JSONObject targetEntityObject = new JSONObject();
        targetEntityObject.put("type", "指标");
        entityset.add(targetEntityObject);
        JSONObject amountEntityObject = new JSONObject();
        amountEntityObject.put("type", "完成");
        entityset.add(amountEntityObject);
        JSONObject achieveEntityObject = new JSONObject();
        achieveEntityObject.put("type", "达成率");
        entityset.add(achieveEntityObject);
        for (int i = 0; i < 12; i++) {
            calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),1,0,0,0);
            Date yearStart = calendar.getTime();
            calendar.add(Calendar.MONTH, 1);
            calendar.add(Calendar.DAY_OF_MONTH, -1);
            Date yearEnd = calendar.getTime();
            int year = calendar.get(Calendar.YEAR);
            int month = calendar.get(Calendar.MONTH) + 1;
            String oneMonth = MessageFormat.format("{0}{1}", year, month);
            BigDecimal totalBudget = BigDecimal.ZERO;
            for (SchemeDetail schemeDetail : detailList) {
                BigDecimal rangeBudget = getRangeBudget(schemeDetail, yearStart, yearEnd);
                totalBudget = totalBudget.add(rangeBudget);
            }
            //2 target
            EntityWrapper<SysTarget> sysTargetEntityWrapper = new EntityWrapper<>();
            sysTargetEntityWrapper.eq("amt_type", "pro")
                    .eq("year", year);
            List<SysTarget> sysTargets = targetService.selectList(sysTargetEntityWrapper);
            BigDecimal totalTarget = BigDecimal.ZERO;
            for (SysTarget sysTarget : sysTargets) {
                BigDecimal one = sysTarget.getTarget();
                totalTarget = totalTarget.add(one);
            }
            BigDecimal achieve;
            if(totalTarget.compareTo(BigDecimal.ZERO) == 0) {
                achieve = BigDecimal.ZERO;
            }else {
                achieve = totalBudget.multiply(BigDecimal.valueOf(100)).divide(totalTarget, 1, BigDecimal.ROUND_HALF_UP);
            }
            ArrayList<BigDecimal> targetData = (ArrayList<BigDecimal>) targetDataObject.get("data");
            if (targetData == null) {
                targetData = new ArrayList<BigDecimal>();
            }
            targetData.add(i, totalTarget);
            ArrayList<BigDecimal> amountData = (ArrayList<BigDecimal>) amountDataObject.get("data");
            if (amountData == null) {
                amountData = new ArrayList<BigDecimal>();
            }
            amountData.add(i, totalBudget);
            ArrayList<BigDecimal> achieveData = (ArrayList<BigDecimal>) achieveDataObject.get("data");
            if (achieveData == null) {
                achieveData = new ArrayList<BigDecimal>();
            }
            achieveData.add(i, achieve);
            targetEntityObject.put(oneMonth, totalTarget);
            amountEntityObject.put(oneMonth, totalBudget);
            achieveEntityObject.put(oneMonth, achieve);
            months.add(oneMonth);
            calendar.add(Calendar.MONTH , -1);
        }
        resultData.put("months",months);
        resultData.put("types",types);
        resultData.put("datas",datas);
        resultData.put("entityset",entityset);
        return Result.success(resultData);
    }
    private Result getAfterOptions(List<SchemeDetail> detailList) throws ParseException {
        //0
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.set(calendar.get(Calendar.YEAR),5,1,0,0,0);
        Date yearStart = calendar.getTime();
        calendar.add(Calendar.MONTH, 7);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        Date yearEnd = calendar.getTime();
        //1 amount
        BigDecimal totalBudget = BigDecimal.ZERO;
        for (SchemeDetail schemeDetail : detailList) {
            BigDecimal rangeBudget = getRangeBudget(schemeDetail, yearStart, yearEnd);
            totalBudget = totalBudget.add(rangeBudget);
        }
        //2 target
        int year = calendar.get(Calendar.YEAR);
        EntityWrapper<SysTarget> sysTargetEntityWrapper = new EntityWrapper<>();
        sysTargetEntityWrapper.eq("amt_type", "pro")
                .eq("year", year).eq("tgt_type","per");
        List<SysTarget> sysTargets = targetService.selectList(sysTargetEntityWrapper);
        BigDecimal totalTarget = BigDecimal.ZERO;
        for (SysTarget sysTarget : sysTargets) {
            BigDecimal one = sysTarget.getTarget();
            totalTarget = totalTarget.add(one);
        }
        if(totalTarget.compareTo(BigDecimal.ZERO) == 0) {
            return Result.success(0);
        }else {
            BigDecimal achieve = totalBudget.multiply(BigDecimal.valueOf(100)).divide(totalTarget, 1, BigDecimal.ROUND_HALF_UP);
            return Result.success(achieve);
        }
    }
    private Result getPerOptions(List<SchemeDetail> detailList) throws ParseException {
        //0
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.set(calendar.get(Calendar.YEAR),0,1,0,0,0);
        Date yearStart = calendar.getTime();
        calendar.add(Calendar.MONTH, 7);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        Date yearEnd = calendar.getTime();
        //1 amount
        BigDecimal totalBudget = BigDecimal.ZERO;
        for (SchemeDetail schemeDetail : detailList) {
            BigDecimal rangeBudget = getRangeBudget(schemeDetail, yearStart, yearEnd);
            totalBudget = totalBudget.add(rangeBudget);
        }
        //2 target
        int year = calendar.get(Calendar.YEAR);
        EntityWrapper<SysTarget> sysTargetEntityWrapper = new EntityWrapper<>();
        sysTargetEntityWrapper.eq("amt_type", "pro")
                .eq("year", year).eq("tgt_type","per");
        List<SysTarget> sysTargets = targetService.selectList(sysTargetEntityWrapper);
        BigDecimal totalTarget = BigDecimal.ZERO;
        for (SysTarget sysTarget : sysTargets) {
            BigDecimal one = sysTarget.getTarget();
            totalTarget = totalTarget.add(one);
        }
        if(totalTarget.compareTo(BigDecimal.ZERO) == 0) {
            return Result.success(0);
        }else {
            BigDecimal achieve = totalBudget.multiply(BigDecimal.valueOf(100)).divide(totalTarget, 1, BigDecimal.ROUND_HALF_UP);
            return Result.success(achieve);
        }
    }
    private Result getTotalOptions(List<SchemeDetail> detailList) throws ParseException {
        //0
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.set(calendar.get(Calendar.YEAR),0,1,0,0,0);
        Date yearStart = calendar.getTime();
        calendar.add(Calendar.YEAR, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        Date yearEnd = calendar.getTime();
        //1 amount
        BigDecimal totalBudget = BigDecimal.ZERO;
        for (SchemeDetail schemeDetail : detailList) {
            BigDecimal rangeBudget = getRangeBudget(schemeDetail, yearStart, yearEnd);
            totalBudget = totalBudget.add(rangeBudget);
        }
        //2 target
        int year = calendar.get(Calendar.YEAR);
        EntityWrapper<SysTarget> sysTargetEntityWrapper = new EntityWrapper<>();
        sysTargetEntityWrapper.eq("amt_type", "pro").eq("year", year);
        List<SysTarget> sysTargets = targetService.selectList(sysTargetEntityWrapper);
        BigDecimal totalTarget = BigDecimal.ZERO;
        for (SysTarget sysTarget : sysTargets) {
            BigDecimal one = sysTarget.getTarget();
            totalTarget = totalTarget.add(one);
        }
        if(totalTarget.compareTo(BigDecimal.ZERO) == 0) {
           return Result.success(0);
        }else {
            BigDecimal achieve = totalBudget.multiply(BigDecimal.valueOf(100)).divide(totalTarget, 1, BigDecimal.ROUND_HALF_UP);
            return Result.success(achieve);
        }
    }
    private BigDecimal getRangeBudget(SchemeDetail schemeDetail, Date yearStart, Date yearEnd) throws ParseException {
        BigDecimal average = BigDecimal.ZERO;
        BigDecimal rangeBudget = BigDecimal.ZERO;
        Integer rangeDays;
        BigDecimal budget = schemeDetail.getBudget();
        Boolean finish = schemeDetail.getFinish();
        Boolean edit = schemeDetail.getEdit();
        Boolean delay = schemeDetail.getDelay();
        if (edit) {
            return BigDecimal.ZERO;
        }
        if (finish) {
            int dayDiffer = DbUtils.getDayDiffer(schemeDetail.getStartTime(), schemeDetail.getFinishTime());
            dayDiffer = Math.abs(dayDiffer);
            average = budget.divide(BigDecimal.valueOf(dayDiffer), 10, BigDecimal.ROUND_HALF_UP);
            rangeDays = DbUtils.getRangeDays(schemeDetail.getStartTime(), schemeDetail.getFinishTime(), yearStart, yearEnd);
            rangeDays = Math.abs(rangeDays);
        }
        if (delay) {
            Date endTime = schemeDetail.getEndTime();
            Integer dayDiffer = null;
            Date now = new Date();
            if (endTime.before(now)) {
                dayDiffer = DbUtils.getDayDiffer(schemeDetail.getStartTime(), now);
                dayDiffer = Math.abs(dayDiffer);
                rangeDays = DbUtils.getRangeDays(schemeDetail.getStartTime(), now, yearStart, yearEnd);
                rangeDays = Math.abs(rangeDays);
            }else {
                dayDiffer = DbUtils.getDayDiffer(schemeDetail.getStartTime(), schemeDetail.getEndTime());
                dayDiffer = Math.abs(dayDiffer);
                rangeDays = DbUtils.getRangeDays(schemeDetail.getStartTime(), schemeDetail.getEndTime(), yearStart, yearEnd);
            }
            average = budget.divide(BigDecimal.valueOf(dayDiffer), 10, BigDecimal.ROUND_HALF_UP);
            rangeBudget = average.multiply(BigDecimal.valueOf(rangeDays));
        }
        return rangeBudget;
    }
    @RequestMapping(value = "/daywork/{id}", method = RequestMethod.GET)
    public Result dayByUser(@PathVariable String id, HttpServletRequest request)  {
@@ -120,6 +420,27 @@
    @RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
    public Result get(@PathVariable String id)  {
        Scheme scheme = schemeService.selectById(id);
        String leadUserId = scheme.getLeadUserId();
        if (!StringUtils.isEmpty(leadUserId)) {
            String[] split = leadUserId.split(";");
            ArrayList<List<String>> lists = new ArrayList<>();
            for (String one : split) {
                if (StringUtils.isEmpty(one)) {
                    continue;
                }
                SysRoleMapping mapping = roleMappingService.selectOne(new EntityWrapper<SysRoleMapping>().eq("user_id", one));
                if (mapping == null) {
                    continue;
                }
                SysRole sysRole = roleService.selectById(mapping.getRoleId());
                ArrayList<String> sysRoleMappings = new ArrayList<>();
                sysRoleMappings.add(sysRole.getName());
                sysRoleMappings.add(mapping.getUserId());
                lists.add(sysRoleMappings);
            }
            scheme.setLeadUserList(lists);
        }
        return Result.success(scheme);
    }
@@ -312,7 +633,10 @@
            detail.setEdit(false);
            detail.updateById();
        }
        scheme.setStatus("working");
        if (scheme.getStatus().equalsIgnoreCase("edit")) {
            scheme.setStatus("working");
        }
        boolean b = scheme.updateById();
        if (b) {
            return Result.success(CodeMsg.UPDATE_SUCCESS);
@@ -327,6 +651,16 @@
        return Result.success(schemes);
    }
    @RequestMapping(value = "/save/{id}", method = RequestMethod.GET)
    public Result save(@PathVariable String id, @RequestParam BigDecimal budget)  {
        Scheme scheme = schemeService.selectById(id);
        if (scheme == null) {
            return Result.error(CodeMsg.ERROR_PARAMS_NOT_MATHED);
        }
        scheme.setBudget(budget).updateById();
        return Result.success(scheme);
    }
    @RequestMapping(value = "/page/{pageNo}", method = RequestMethod.GET)
    public Result get(@PathVariable Integer pageNo, HttpServletRequest request)  {
        String pageSize = request.getParameter("pageSize");
@@ -334,19 +668,28 @@
        String status = request.getParameter("status");
        String type = request.getParameter("type");
        String userId = request.getParameter("userId");
        String isRun = request.getParameter("isRun");
        String orderBy = request.getParameter("orderBy");
        EntityWrapper<Scheme> schemeEntityWrapper = new EntityWrapper<>();
        if (!StringUtils.isEmpty(name)) {
            schemeEntityWrapper.like("name", name);
        }
        if (!StringUtils.isEmpty(orderBy)) {
            schemeEntityWrapper.orderBy(orderBy);
        }
        if (!StringUtils.isEmpty(userId)) {
            schemeEntityWrapper.eq("user_id", userId);
        }
        if (!StringUtils.isEmpty(type)) {
            schemeEntityWrapper.eq("reseach_type", type);
            schemeEntityWrapper.like("type", type);
        }
        if (!StringUtils.isEmpty(status)) {
            schemeEntityWrapper.eq("status", status);
        }
        if (!StringUtils.isEmpty(isRun) && Boolean.valueOf(isRun)) {
            schemeEntityWrapper.ne("status", "edit");
        }
        Page<Scheme> schemePage;
@@ -359,23 +702,45 @@
        }
        Page<Scheme> page = schemeService.selectPage(schemePage, schemeEntityWrapper);
        List<Scheme> schemes = schemeService.selectList(schemeEntityWrapper);
        JSONObject resultObj = new JSONObject();
        BigDecimal decimal  = new BigDecimal(0);
        BigDecimal moneydecimal  = new BigDecimal(0);
        for (Scheme scheme : schemes) {
            if (scheme.getBudget() != null) {
                decimal = decimal.add(scheme.getBudget());
            }
            if (scheme.getPayMoney() != null) {
                moneydecimal = moneydecimal.add(scheme.getPayMoney());
            }
        }
        resultObj.fluentPut("budget", decimal);
        resultObj.fluentPut("payMoney", moneydecimal);
        List<Scheme> records = page.getRecords();
        Page<JSONObject> jsonObjectPage = new Page<>();
        jsonObjectPage.setTotal(page.getTotal());
        jsonObjectPage.setCurrent(page.getCurrent());
        jsonObjectPage.setSize(page.getSize());
        List<JSONObject> result = new ArrayList<>();
        for (Scheme scheme : records) {
            JSONObject json = (JSONObject) JSON.toJSON(scheme);
            Wrapper<SchemeDetail> delayWrapper = new EntityWrapper<SchemeDetail>().eq("parent_id", scheme.getId());
            Wrapper<SchemeDetail> finishWrapper = new EntityWrapper<SchemeDetail>().eq("parent_id", scheme.getId());
            int total = iSchemeDetailService.selectCount(delayWrapper);
            List<SchemeDetail> detailList = iSchemeDetailService.selectList(delayWrapper);
            BigDecimal totalBudget = new BigDecimal(0);
            for (SchemeDetail detail : detailList) {
                BigDecimal budget = detail.getBudget();
                totalBudget = totalBudget.add(budget);
            }
            int total =detailList.size();
            int delayInt = iSchemeDetailService.selectCount(delayWrapper.eq("delay", true));
            int finishInt = iSchemeDetailService.selectCount(finishWrapper.eq("finish", true));
            json.fluentPut("totalCnt", total);
            json.fluentPut("delayCnt", delayInt);
            json.fluentPut("finishCnt", finishInt);
            json.fluentPut("totalBudget", totalBudget);
            //
            List<SchemeDetail> schemeDetailList = iSchemeDetailService.selectList(new EntityWrapper<SchemeDetail>().eq("parent_id", scheme.getId()).eq("finish", true));
@@ -395,10 +760,14 @@
                if (endDate == null) {
                    endDate = detail.getFinishTime();
                }else {
                    int i = DbUtils.compareDate(endDate, detail.getFinishTime());
                    if(i == 1) {
                        endDate = detail.getFinishTime();
                    if (detail.getFinish() && detail.getFinishTime() != null) {
                        int i = DbUtils.compareDate(endDate, detail.getFinishTime());
                        if(i == 1) {
                            endDate = detail.getFinishTime();
                        }
                    }
                }
            }
            json.fluentPut("beginDate", beginDate);
@@ -406,29 +775,37 @@
            result.add(json);
        }
        jsonObjectPage.setRecords(result);
        return Result.success(jsonObjectPage);
        resultObj.fluentPut("datas", jsonObjectPage);
        return Result.success(resultObj);
    }
    @RequestMapping(value = "/checkCode/{code}", method = RequestMethod.GET)
    public Result add(@RequestParam String code) {
        int cnt = schemeService.selectCount(new EntityWrapper<Scheme>().eq("code", code));
        if (cnt == 0) {
            return Result.success(true);
        }
        return Result.success(false);
    }
    @RequestMapping(value = "/addOrUpdate", method = RequestMethod.GET)
    public Result add(@RequestParam String reseachType, @RequestParam String name, @RequestParam Date startTime, @RequestParam Date endTime, HttpServletRequest request)  {
        String id = request.getParameter("id");
        String desp = request.getParameter("desp");
        String userId = request.getParameter("userId");
        Scheme scheme;
        if (StringUtils.isEmpty(id)) {
            scheme = new Scheme();
        }else{
            scheme = schemeService.selectById(id);
    @RequestMapping(value = "/addOrUpdate", method = RequestMethod.POST)
    public Result add( @RequestBody Scheme scheme)  {
        String code = scheme.getCode();
        Wrapper<Scheme> codeWrapper = new EntityWrapper<Scheme>().eq("code", code);
        if (!StringUtils.isEmpty(scheme.getId())) {
            codeWrapper.ne("id", scheme.getId());
        }
        if (scheme == null) {
            return Result.error(CodeMsg.SELECT_ERROR_NOTFOUND);
        int i = schemeService.selectCount(codeWrapper);
        if (i > 0) {
            return Result.error(CodeMsg.EXISTSCODE_ERROR);
        }
        // reseachType to enum
        if (StringUtils.isEmpty(scheme.getId())) {
            scheme.setId(DbUtils.getUUID());
            scheme.setId(DbUtils.getUUID()).setCreateTime(new Date());
        }
        scheme.setUserId(userId).setCreateTime(new Date()).setName(name).setStartTime(startTime).setEndTime(endTime)
                .setDesp(desp).setReseachType(reseachType);
        Date startTime = scheme.getStartTime();
        Date endTime = scheme.getEndTime();
        List<SchemeDetail> schemeDetailList = iSchemeDetailService.selectList(new EntityWrapper<SchemeDetail>().eq("parent_id", scheme.getId()));
        for (SchemeDetail detail : schemeDetailList) {
@@ -446,6 +823,8 @@
                    detail.setEndTime(endTime);
                }
            }
            boolean updated = detail.updateById();
        }
@@ -495,6 +874,12 @@
    @RequestMapping(value = "/del/{id}", method = RequestMethod.GET)
    public Result del(@PathVariable String id, HttpServletRequest request) throws JsonProcessingException {
        Scheme scheme = schemeService.selectById(id);
        List<SchemeDetail> schemeDetailList = iSchemeDetailService.selectList(new EntityWrapper<SchemeDetail>().eq("parent_id", scheme.getId()));
        for (SchemeDetail detail : schemeDetailList) {
            detailParttimeService.delete(new EntityWrapper<SchemeDetailParttime>().eq("parent_id", detail.getId()));
            detail.deleteById();
        }
        boolean delete = scheme.deleteById();
        if (delete) {