ProjectServiceImpl.java 16.6 KB
Newer Older
eddie.woo's avatar
eddie.woo committed
1 2
package pwc.taxtech.atms.service.impl;

3 4
import com.beust.jcommander.internal.Lists;
import com.google.common.base.Predicate;
eddie.woo's avatar
eddie.woo committed
5 6 7 8 9
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pwc.taxtech.atms.common.CommonUtils;
10 11 12
import pwc.taxtech.atms.common.OperateLogType;
import pwc.taxtech.atms.common.OperationModule;
import pwc.taxtech.atms.dao.OrganizationServiceTemplateGroupMapper;
eddie.woo's avatar
eddie.woo committed
13
import pwc.taxtech.atms.dao.ProjectClientMapper;
14
import pwc.taxtech.atms.dao.ProjectMapper;
15
import pwc.taxtech.atms.dao.ProjectServiceTypeMapper;
eddie.woo's avatar
eddie.woo committed
16 17
import pwc.taxtech.atms.dao.ServiceTypeMapper;
import pwc.taxtech.atms.dao.TemplateGroupMapper;
18
import pwc.taxtech.atms.dto.FieldsMapper;
eddie.woo's avatar
eddie.woo committed
19 20 21
import pwc.taxtech.atms.dto.ProjectClientDto;
import pwc.taxtech.atms.dto.ServiceTypeDto;
import pwc.taxtech.atms.dto.TemplateGroupDto;
22
import pwc.taxtech.atms.dto.taxadmin.AddProjectResult;
23
import pwc.taxtech.atms.dto.taxadmin.ProjectDisplayDto;
24
import pwc.taxtech.atms.dto.taxadmin.ProjectYearParam;
25
import pwc.taxtech.atms.entitiy.*;
eddie.woo's avatar
eddie.woo committed
26
import pwc.taxtech.atms.entitiy.ProjectClientExample.Criteria;
27
import pwc.taxtech.atms.service.OperationLogService;
eddie.woo's avatar
eddie.woo committed
28 29
import pwc.taxtech.atms.service.ProjectService;

30 31 32 33 34 35
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
36
import java.util.UUID;
37 38
import java.util.stream.Collectors;

eddie.woo's avatar
eddie.woo committed
39 40
@Service
public class ProjectServiceImpl implements ProjectService {
41 42 43 44
    /**
     * @see PwC.Tax.Tech.Atms..Admin.Application\Services\Impl\ProjectService.cs
     */
    private static final int FIRST_OR_DEFAULT = 0;
45
    private static Logger LOGGER = LoggerFactory.getLogger(ProjectServiceImpl.class);
eddie.woo's avatar
eddie.woo committed
46 47 48 49 50 51 52 53 54 55

    @Autowired
    private ServiceTypeMapper serviceTypeMapper;

    @Autowired
    private TemplateGroupMapper templateGroupMapper;

    @Autowired
    private ProjectClientMapper projectClientMapper;

56 57 58
    @Autowired
    private ProjectMapper projectMapper;

59 60 61 62 63 64 65 66 67 68
    @Autowired
    private OrganizationServiceTemplateGroupMapper organizationServiceTemplateGroupMapper;

    @Autowired
    private ProjectServiceTypeMapper projectServiceTypeMapper;

    @Autowired
    private OperationLogService operationLogService;

    private final OperateLogType LOG_TYPE = OperateLogType.OperationLogProject;
eddie.woo's avatar
eddie.woo committed
69 70
    private static final Logger logger = LoggerFactory.getLogger(ProjectServiceImpl.class);

71 72 73
    public ProjectServiceImpl() {
    }

eddie.woo's avatar
eddie.woo committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
    @Override
    public List<ServiceTypeDto> getServiceList() {

        ServiceTypeExample serviceTypeExample = new ServiceTypeExample();
        serviceTypeExample.createCriteria().andIsActiveEqualTo(true);

        logger.debug("获取ServiceType Start");
        List<ServiceType> serviceTypeList = serviceTypeMapper.selectByExample(serviceTypeExample);

        logger.debug("获取TemplateGroup Start");
        List<TemplateGroup> templateGroupList = templateGroupMapper.selectByExample(new TemplateGroupExample());

        List<ServiceTypeDto> serviceTypeDtoList = serviceTypeList.stream().map(this::rotateServiceType)
                .collect(Collectors.toList());
        List<TemplateGroupDto> templateGroupDtoList = templateGroupList.stream().map(this::rotateTemplateGroup)
                .collect(Collectors.toList());

        for (ServiceTypeDto serviceTypeDto : serviceTypeDtoList) {
            // serviceType 和 templateGroup是上下层级关系,遍历ServiceTypeDto,
            // 并将每个ServiceType下级关联的templateGroup填充进去
            serviceTypeDto.setTemplateGroupList(templateGroupDtoList.stream()
                    .filter(templateGroupDto -> (serviceTypeDto.getID().equals(templateGroupDto.getServiceTypeID())))
                    .collect(Collectors.toList()));
        }
        return serviceTypeDtoList;
    }

    @Override
    public List<ProjectClientDto> getProjectClientList() {
        logger.debug("获取ProjectClient Start");
        ProjectClientExample example = new ProjectClientExample();
        example.setOrderByClause("CreateTime desc");
        Criteria criteria = example.createCriteria();
        criteria.andIsActiveEqualTo(true);
        List<ProjectClient> projectClientList = projectClientMapper.selectByExample(example);
        return projectClientList.stream().map(this::rotateProjectClient).collect(Collectors.toList());
    }

112 113 114
    /**
     * @TODO: this dmeo only for running,should change to query data from db (neo)
     */
115 116
    @Override
    public List<ProjectDisplayDto> getProjectByID(String projectID) {
117
        List<ProjectDisplayDto> displayDtos = new ArrayList<>();
118 119 120 121
        displayDtos.add(new ProjectDisplayDto().demo());
        return displayDtos;
    }

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    @Override
    public List<ProjectDisplayDto> getAllProjectList(String orgID, String serviceID, Integer projectYear) {
        List<ProjectDisplayDto> pList = new ArrayList<>();
        List<ProjectDisplayDto> data = projectMapper.getProjectList(orgID, serviceID, projectYear);
        //获取每个项目的项目状态
        data.forEach(p -> {
            p.setProjectStatusList(projectMapper.getProjectSatusListByDbName(p.getDbName()));
        });
        //添加账套中需要创建的项目
        List<ProjectDisplayDto> orgList = getProjectFromEnterpriseAccountSetOrg(data, orgID, serviceID, projectYear);
        //修改账套时间变化引起的已建项目的月份更改
        List<ProjectDisplayDto> removeList = new ArrayList<>();

        orgList.forEach(p -> {
            List<ProjectDisplayDto> fixList = data.stream()
                    .filter((Predicate<ProjectDisplayDto>) x -> x.getOrganizationID() == p.getOrganizationID()
                            && x.getEnterpriseAccountSetID() == p.getEnterpriseAccountSetID()
                            && x.getServiceTypeID() == p.getServiceTypeID()
                            && x.getYear() == p.getYear()
                            && (x.getStartPeriod() != p.getStartPeriod() || x.getEndPeriod() != p.getEndPeriod()))
                    .collect(Collectors.toList());

144 145
            if (fixList != null && !fixList.isEmpty()) {
                ProjectDisplayDto pddFirst = fixList.get(FIRST_OR_DEFAULT);
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

                //修改数据库对应项目起始月
                Project project = new Project();
                project.setID(pddFirst.getId());
                project.setStartPeriod(p.getStartPeriod());
                project.setEndPeriod(p.getEndPeriod());

                projectMapper.updateByPrimaryKey(project);

                //修改已取出数据中项目起始月
                pddFirst.setStartPeriod(p.getStartPeriod());
                pddFirst.setEndPeriod(p.getEndPeriod());
                //删除该条为创建项目记录
                removeList.add(p);
            }
        });

163 164 165
        removeList.forEach(r -> {
            orgList.remove(r);
        });
166 167 168 169 170 171

        pList.addAll(data);
        pList.addAll(orgList);
        return pList;
    }

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
    @Override
    public AddProjectResult addProject(ProjectDisplayDto projectDto, String userName) {
        projectDto.setActive(true);
        projectDto.setRuleType(1);

        Project project = new Project();
        try {
            FieldsMapper.map(projectDto, project);
        } catch (Exception e) {
            LOGGER.warn("map project dto to project may be some error");
            e.printStackTrace();
        }

        try {
            project.setID(UUID.randomUUID().toString());

            OrganizationServiceTemplateGroupExample example = new OrganizationServiceTemplateGroupExample();
            example.createCriteria().andOrganizationIDEqualTo(projectDto.getOrganizationID());
            organizationServiceTemplateGroupMapper.selectByExample(example).forEach(ostg -> {
                ProjectServiceType pst = new ProjectServiceType();
                pst.setID(UUID.randomUUID().toString());
193
                pst.setProjectID(project.getID());
194 195 196 197 198 199 200 201 202
                pst.setServiceTypeID(ostg.getServiceTypeID());
                pst.setTemplateGroupID(ostg.getTemplateGroupID());

                projectServiceTypeMapper.insert(pst);
                operationLogService.addDataAddLog(pst, OperationModule.ProjectServiceType, userName,
                        Message.Project.AddProjectServiceType, pst.getID(), projectDto.getName(), LOG_TYPE);
            });

            project.setDbName(generateDatabase(project, projectDto.getEnterpriseAccountSetID()));
203
            project.setUpdateTime(new Date());
204 205 206 207 208 209
            projectMapper.insert(project);
            operationLogService.addDataAddLog(project, OperationModule.Project, userName, Message.Project.AddProject,
                    project.getID(), projectDto.getName(), LOG_TYPE);

            AddProjectResult addProjectResult = new AddProjectResult();
            addProjectResult.setResult(true);
neo's avatar
neo committed
210
            addProjectResult.setDbName(project.getDbName());
211 212 213 214 215 216 217 218 219 220 221 222 223 224
            addProjectResult.setProjectID(project.getID());
            return addProjectResult;
        }catch (Exception e){
            operationLogService.addDataAddLog(null, OperationModule.Project, userName,
                    Message.Project.AddProjectFail, e.getMessage(), projectDto.getName(), LOG_TYPE);

            AddProjectResult addProjectResult = new AddProjectResult();
            addProjectResult.setResult(false);
            addProjectResult.setResultMsg(e.getMessage());
            return addProjectResult;
        }

    }

225 226 227 228 229 230 231 232 233 234 235
    @Override
    public Map<Integer, Integer> getProjectAllStatus(String dbName) {
        List<ProjectStatusManage> psmList= projectMapper.selectProjectAllStatus(dbName);
        Map<Integer,Integer> result =new HashMap<>(psmList.size());
        psmList.forEach(m->{
            result.put(m.getPeriodId(),m.getStatus());
        });

        return result;
    }

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
    private String generateDatabase(Project project, String accsetid) {//TODO: should be impl future(neo)
        return "db_test";
    }

    private String GenerateProjectDbName(String maxName, String year) {
        year = year.substring(2);
        String pre2 = maxName.charAt(0) + "", post2 = "";
        int post = Integer.parseInt(maxName.substring(3)) + 1;
        if (post >= 100000) {
            Integer pre = Integer.parseInt(String.valueOf(maxName.charAt(0)));
            pre2 = ((char)(pre+1))+"";
            post2 = "00000";
        } else if (post >= 10000) {
            post2 = post + "";
        } else if (post >= 1000) {
            post2 = "0" + post;
        } else if (post >= 100) {
            post2 = "00" + post;
        } else if (post >= 10) {
            post2 = "000" + post;
        } else {
            post2 = "0000" + post;
        }
        return pre2 + year + post2;
    }

262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
    private List<ProjectDisplayDto> getProjectFromEnterpriseAccountSetOrg(List<ProjectDisplayDto> pList, String orgID,
                                                                          String serviceID, Integer projectYear) {
        List<ProjectDisplayDto> list = new ArrayList<>();
        List<ProjectDisplayDto> data = projectMapper.getProjectFromEnterpriseAccountSetOrg(orgID, serviceID);
        Map<String, ProjectDisplayDto> groupMap = new HashMap<>();

        if (data != null && data.size() > 0) {
            //去除project表已经存在的项目 g
            data.forEach(dto -> {
                getOrgProjectYears(dto.getEffectiveDate(), dto.getExpiredDate()).forEach(yDto -> {
                    dto.setYear(yDto.year);
                    dto.setStartPeriod(yDto.startMonth);
                    dto.setEndPeriod(yDto.endMonth);
                    dto.setName(dto.getOrganizationName() + "(" + dto.getYear() + ")");

                    //判断是否已经创建过该项目
                    //对于VAT,只创建今年及之后年份的项目(2018.1.2经Michelle确定,已放开vat限制)
                    //if ((projectList != null && projectList.Count > 0) || (int.Parse(orgDto.ServiceTypeID) == 2 && orgDto.Year < DateTime.Now.Year))
                    if (!pList.stream().anyMatch((Predicate<ProjectDisplayDto>) t -> t.getYear() == dto.getYear()
                            && t.getServiceTypeID() == dto.getServiceTypeID()
                            && t.getOrganizationID() == dto.getOrganizationID()
                            && t.getEnterpriseAccountSetID() == dto.getEnterpriseAccountSetID()
                            && t.getStartPeriod() == dto.getStartPeriod()
                            && t.getEndPeriod() == dto.getEndPeriod())) {
                        list.add(dto);
                    }
                });
            });

            if (!list.isEmpty()) {
                list.forEach(m -> {
                    StringBuilder groupKeyBulder = new StringBuilder(m.getOrganizationID()).append("_")
                            .append(m.getEnterpriseAccountSetID()).append("_")
                            .append(m.getYear()).append("_")
                            .append(m.getServiceTypeID()).append("_")
                            .append(m.getStartPeriod()).append("_")
                            .append(m.getEndPeriod());

                    groupMap.putIfAbsent(groupKeyBulder.toString(), m);
                });
            }
        }

        return Lists.newArrayList(groupMap.values());

    }

    private List<ProjectYearParam> getOrgProjectYears(Date startDate, Date endDate) {
        List<ProjectYearParam> pList = new ArrayList<>();

        ProjectYearParam pYear = new ProjectYearParam();
        Calendar nowCal = Calendar.getInstance();
        Date nowDate = new Date();
        nowCal.setTime(nowDate);

        Calendar startCal = Calendar.getInstance();
        startCal.setTime(startDate);

        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);
        if (startDate == null && endDate == null) {
            pYear.year = nowCal.get(Calendar.YEAR);
            pYear.startMonth = 1;
            pYear.endMonth = 12;

            pList.add(pYear);
        } else if (startDate == null && endDate != null && endCal.after(nowCal)) {
            pList.addAll(getProjectYears(nowDate, endDate));
        } else if (startDate != null && endDate == null && startCal.before(nowCal)) {
            pList.addAll(getProjectYears(startDate, nowDate));
        } else if (startDate != null && endDate != null && startCal.get(Calendar.YEAR) <= endCal.get(Calendar.YEAR)) {
            pList.addAll(getProjectYears(startDate, endDate));
        }
        return pList;
    }

    private List<ProjectYearParam> getProjectYears(Date startDate, Date endDate) {
        List<ProjectYearParam> pList = new ArrayList<>();

        Calendar start = Calendar.getInstance();
        start.setTime(startDate);
        int startYear = start.get(Calendar.YEAR);

        Calendar end = Calendar.getInstance();
        end.setTime(endDate);
        int endYear = end.get(Calendar.YEAR);

349
        if (startDate != null && endDate != null && startYear <= endYear) {
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
            for (int i = startYear; i <= endYear; i++) {
                ProjectYearParam pYear = new ProjectYearParam();
                pYear.year = i;
                if (startYear == endYear) {
                    pYear.startMonth = start.get(Calendar.MONTH);
                    pYear.endMonth = end.get(Calendar.MONTH);
                } else if (i == startYear && i < endYear) {
                    pYear.startMonth = start.get(Calendar.MONTH);
                    pYear.endMonth = 12;
                } else if (i > startYear && i < endYear) {
                    pYear.startMonth = 1;
                    pYear.endMonth = 12;
                } else if (i > startYear && i == endYear) {
                    pYear.startMonth = 1;
                    pYear.endMonth = end.get(Calendar.MONTH);
                }
                pList.add(pYear);
            }
        }
        return pList;
    }

    /**
     * @TODO: change the return part after copyProperties function updated
     */
eddie.woo's avatar
eddie.woo committed
375 376 377 378 379
    private ServiceTypeDto rotateServiceType(ServiceType serviceType) {
        ServiceTypeDto serviceTypeDto = new ServiceTypeDto();
        return CommonUtils.copyProperties(serviceType, serviceTypeDto);
    }

380 381 382
    /**
     * @TODO: change the return part after copyProperties function updated
     */
eddie.woo's avatar
eddie.woo committed
383 384 385 386 387
    private TemplateGroupDto rotateTemplateGroup(TemplateGroup templateGroup) {
        TemplateGroupDto templateGroupDto = new TemplateGroupDto();
        return CommonUtils.copyProperties(templateGroup, templateGroupDto);
    }

388 389 390
    /**
     * @TODO: change the return part after copyProperties function updated
     */
eddie.woo's avatar
eddie.woo committed
391 392 393 394 395 396
    private ProjectClientDto rotateProjectClient(ProjectClient projectClient) {
        ProjectClientDto projectClientDto = new ProjectClientDto();
        return CommonUtils.copyProperties(projectClient, projectClientDto);
    }

}