Commit 33578ccf authored by chase's avatar chase

Merge branch 'dev_mysql' of http://code.tech.tax.asia.pwcinternal.com/root/atms into dev_mysql

parents e1326021 f3a9dcc7
......@@ -295,11 +295,6 @@
<artifactId>reflectasm</artifactId>
<version>1.11.7</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
......@@ -426,6 +421,11 @@
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</dependency>
</dependencies>
......
......@@ -51,12 +51,19 @@ public class AnalysisController extends BaseController {
}
@RequestMapping(value = "downloadDomesticFile/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public void downloadCILQueryData(@RequestBody AnalysisDomesticlParam param, HttpServletResponse response) {
public void downloadDomesticFile(@RequestBody AnalysisDomesticlParam param, HttpServletResponse response) {
logger.debug("enter downloadDomesticFile");
String fileName="testFile";
analysisServiceImpl.downloadDomesticFile(response, param, fileName);
}
@RequestMapping(value = "downloadInternationalFile/get", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public void downloadInternationalFile(@RequestBody AnalysisInternationlParam param, HttpServletResponse response) {
logger.debug("enter downloadInternationalFile");
String fileName="testFile";
analysisServiceImpl.downloadInternationalFile(response, param, fileName);
}
@ResponseBody
@RequestMapping(value = "getAnalysisInternationalCompanyList", method = RequestMethod.GET)
......
......@@ -12,7 +12,9 @@ import pwc.taxtech.atms.dpo.EnterpriseAccountSetOrgDto;
public class CommonUtils {
public static final int BATCH_NUM = 500;
public static final int BATCH_NUM_1000 = 1000;
public static final int BATCH_NUM_2000 = 2000;
public static String getUUID() {
return UUID.randomUUID().toString().toUpperCase();
}
......
......@@ -9,5 +9,7 @@ public class ErrorMessageCN {
public static final String DoNotSelectCompany = "非选定主体";
public static final String StrctureRepeat = "层级重复!";
public static final String BusinssUnitRepeat = "事业部重复!";
public static final String BusinssUnitUpdateFailed = "未对事业部名称或状态进行修改!";
public static final String OrgStructureFailed = "未对事业部名称或状态进行修改!";
}
package pwc.taxtech.atms.constant;
import java.io.File;
import java.text.DecimalFormat;
import java.util.Locale;
import java.util.UUID;
public final class Constant {
......@@ -129,6 +131,7 @@ public final class Constant {
public static String DECIMAL_FORMAT = "#,##0.00";
public static String ZERO_STR = "0";
public static final String DEFAULT_END_DATE = "9999-12";
public static class ReportDataValidateLog{
......
package pwc.taxtech.atms.constant.enums;
public enum EnumAnalysisExpTempPath {
EachTaxAmount(0, "/analysis_excel_template/tax_data.xlsx"),
ActualReturnTax(1, "/analysis_excel_template/actual_tax_return.xlsx"),
GMVSubsidy(2, "/analysis_excel_template/gmv_subsidy.xlsx"),
EmployeeNum(3, "/analysis_excel_template/employ_num.xlsx"),
DriverNum(4, "/analysis_excel_template/driver_num.xlsx"),
BUData(100, "/analysis_excel_template/international_bu_data.xlsx"),
TaxData(101, "/analysis_excel_template/international_tax_data.xlsx"),
;
private Integer code;
private String path;
EnumAnalysisExpTempPath(Integer code, String path) {
this.code = code;
this.path = path;
}
public Integer getCode() {
return code;
}
public String getPath() {
return path;
}
public static EnumAnalysisExpTempPath fromCode(Integer code){
for(EnumAnalysisExpTempPath enu: EnumAnalysisExpTempPath.values()){
if(enu.getCode().intValue()==code.intValue())return enu;
}
return null;
}
public static String getPath(Integer code){
for(EnumAnalysisExpTempPath eaetp: EnumAnalysisExpTempPath.values()){
if(eaetp.getCode().intValue()==code.intValue())return eaetp.path;
}
return null;
}
}
......@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import pwc.taxtech.atms.dto.ApiResultDto;
import pwc.taxtech.atms.dto.BusinessUnitDto;
import pwc.taxtech.atms.dto.BusinessUnitInputDto;
import pwc.taxtech.atms.dto.IdModel;
......@@ -36,9 +37,9 @@ public class BusinessUnitController {
// @ApiOperation(value = "主数据事业部增加", notes = "根据Request Body的信息添加一个或多个新的事业部数据")
@RequestMapping(value = "/add", method = RequestMethod.POST)
public void addBusinessUnits(@RequestBody List<BusinessUnitInputDto> businessUnitDtoList) {
public ApiResultDto addBusinessUnits(@RequestBody List<BusinessUnitInputDto> businessUnitDtoList) {
logger.debug("BusinessUnitController addBusinessUnits");
businessUnitService.addBusinessUnits(businessUnitDtoList);
return businessUnitService.addBusinessUnits(businessUnitDtoList);
}
// @ApiOperation(value = "主数据事业部删除", notes = "根据给定的id删除一条事业部数据")
......@@ -52,7 +53,7 @@ public class BusinessUnitController {
// @ApiOperation(value = "主数据事业部修改", notes = "根据Request Body的信息修改一个或多个事业部数据")
@RequestMapping(method = RequestMethod.PUT)
public @ResponseBody
Boolean updateBusinessUnits(@RequestBody List<BusinessUnitDto> businessUnitDtoList) {
ApiResultDto updateBusinessUnits(@RequestBody List<BusinessUnitDto> businessUnitDtoList) {
logger.debug("BusinessUnitController updateBusinessUnit");
return businessUnitService.updateBusinessUnits(businessUnitDtoList);
}
......
......@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import pwc.taxtech.atms.dto.ApiResultDto;
import pwc.taxtech.atms.dto.IdModel;
import pwc.taxtech.atms.dto.OrganizationStructureDto;
import pwc.taxtech.atms.dto.OrganizationStructureInputDto;
......@@ -35,9 +36,9 @@ public class OrganizationStructureController {
// @ApiOperation(value = "主数据机构层级增加")
// @ApiImplicitParam(name = "organizationStructureDtoList", value = "organizationStructureDto List", required = true, dataType = "List<OrganizationStructureDto>")
@RequestMapping(value = "/add", method = RequestMethod.POST)
public void addOrganizationStructures(@RequestBody List<OrganizationStructureInputDto> organizationStructureDtoList) {
public ApiResultDto addOrganizationStructures(@RequestBody List<OrganizationStructureInputDto> organizationStructureDtoList) {
logger.debug("OrganizationStructureController /add");
organizationStructureService.addOrganizationStructures(organizationStructureDtoList);
return organizationStructureService.addOrganizationStructures(organizationStructureDtoList);
}
// @ApiOperation(value = "主数据机构层级删除")
......@@ -53,7 +54,7 @@ public class OrganizationStructureController {
// @ApiImplicitParam(name = "organizationStructureDtoList", value = "organizationStructureDto List", required = true, dataType = "List<OrganizationStructureDto>")
@RequestMapping(method = RequestMethod.PUT)
public @ResponseBody
Boolean updateOrganizationStructure(@RequestBody List<OrganizationStructureInputDto> organizationStructureDtoList) {
ApiResultDto updateOrganizationStructure(@RequestBody List<OrganizationStructureInputDto> organizationStructureDtoList) {
logger.debug("OrganizationStructureController update");
return organizationStructureService.updateOrganizationStructures(organizationStructureDtoList);
}
......
......@@ -43,4 +43,10 @@ public class RevenueConfController extends BaseController {
revenueConfService.updateConfig(config);
return ApiResultDto.success();
}
@PostMapping("del")
public ApiResultDto delConf(@RequestBody List<Long> idList) {
revenueConfService.delConfig(idList);
return ApiResultDto.success();
}
}
package pwc.taxtech.atms.controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import pwc.taxtech.atms.dto.ApiResultDto;
import pwc.taxtech.atms.dto.input.CamelPagingResultDto;
import pwc.taxtech.atms.dto.revenuconf.RevTypeAddDto;
import pwc.taxtech.atms.dto.revenuconf.RevenueConfParam;
import pwc.taxtech.atms.dto.revenuconf.RevenueTypeResult;
import pwc.taxtech.atms.service.impl.RevenueTypeMappingService;
import pwc.taxtech.atms.vat.entity.RevenueTypeMapping;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping(value = "api/v1/revenueConfMapping")
public class RevenueConfMappingController extends BaseController {
@Resource
private RevenueTypeMappingService mappingService;
@PostMapping("queryPage")
public CamelPagingResultDto<RevenueTypeResult> queryPage(@RequestBody RevenueConfParam param) {
return new CamelPagingResultDto<>(mappingService.queryPage(param));
}
@PostMapping("add")
public ApiResultDto addConf(@RequestBody RevTypeAddDto addDto) {
mappingService.addConfig(addDto);
return ApiResultDto.success();
}
@PostMapping("update")
public ApiResultDto updateConf(@RequestBody RevenueTypeMapping mapping) {
mappingService.updateConfig(mapping);
return ApiResultDto.success();
}
@PostMapping("del")
public ApiResultDto delConf(@RequestBody List<Long> idList) {
mappingService.delConfig(idList);
return ApiResultDto.success();
}
@PostMapping("upload")
public ApiResultDto upload(@RequestParam MultipartFile file, @RequestParam Integer type) throws Exception {
mappingService.upload(file, type);
return ApiResultDto.success();
}
}
package pwc.taxtech.atms.dto.analysis;
import java.math.BigDecimal;
/**
* @Auther: Gary J Li
* @Date: 15/03/2019 00:30
* @Description:
*/
public class AnalysisDriverNumDto {
private String driverType;
private BigDecimal driverNum;
public String getDriverType() {
return driverType;
}
public void setDriverType(String driverType) {
this.driverType = driverType;
}
public BigDecimal getDriverNum() {
return driverNum;
}
public void setDriverNum(BigDecimal driverNum) {
this.driverNum = driverNum;
}
}
package pwc.taxtech.atms.dto.revenuconf;
import pwc.taxtech.atms.vat.entity.RevenueTypeMapping;
import java.util.List;
public class RevTypeAddDto extends RevenueTypeMapping {
private List<String> orgList;
public List<String> getOrgList() {
return this.orgList;
}
public void setOrgList(List<String> orgList) {
this.orgList = orgList;
}
}
......@@ -24,4 +24,8 @@ public class RevenueConfResult extends RevenueConfig {
public String getStatusStr() {
return RevenueConfEnum.Status.MAPPING.get(this.getStatus());
}
public String getIdStr() {
return this.getId().toString();
}
}
package pwc.taxtech.atms.dto.revenuconf;
import pwc.taxtech.atms.constant.enums.RevenueConfEnum;
import pwc.taxtech.atms.vat.entity.RevenueTypeMapping;
public class RevenueTypeResult extends RevenueTypeMapping {
public String getStatusStr() {
return RevenueConfEnum.Status.MAPPING.get(this.getStatus());
}
}
......@@ -7,8 +7,11 @@ import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import pwc.taxtech.atms.analysis.dao.*;
import pwc.taxtech.atms.analysis.entity.*;
import pwc.taxtech.atms.common.message.ErrorMessage;
import pwc.taxtech.atms.common.message.ErrorMessageCN;
import pwc.taxtech.atms.common.util.DateUtils;
import pwc.taxtech.atms.constant.enums.EnumAnalysisExpTempPath;
import pwc.taxtech.atms.constant.enums.EnumAnalysisImportType;
import pwc.taxtech.atms.dto.OperationResultDto;
import pwc.taxtech.atms.dto.analysis.*;
import pwc.taxtech.atms.exception.ServiceException;
......@@ -16,6 +19,7 @@ import pwc.taxtech.atms.exception.ServiceException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
......@@ -70,7 +74,7 @@ public class AnalysisServiceImpl extends BaseService {
Map<String, List<AnalysisTax>> actrs =
list.stream().collect(Collectors.groupingBy(AnalysisTax::getCompanyName));
actrs.forEach((k, v) -> processAts(k, v,dtos));
objects.add(dtos);
objects.addAll(dtos);
break;
case 1:
AnalysisActualTaxReturnExample analysisActualTaxReturnExample = new AnalysisActualTaxReturnExample();
......@@ -80,13 +84,13 @@ public class AnalysisServiceImpl extends BaseService {
Map<String, List<AnalysisActualTaxReturn>> actrs2 =
list2.stream().collect(Collectors.groupingBy(AnalysisActualTaxReturn::getCompanyName));
actrs2.forEach((k, v) -> processActrs(k, v,dtos2));
objects.add(dtos2);
objects.addAll(dtos2);
return objects;
case 2:
AnalysisGmvSubsidyExample analysisGmvSubsidyExample = new AnalysisGmvSubsidyExample();
analysisGmvSubsidyExample.createCriteria().andPeriodEqualTo(period);
List<AnalysisGMVSubsidyDto> dtos3 = generalDtos(analysisGmvSubsidyMapper.selectByExample(analysisGmvSubsidyExample));
objects.add(dtos3);
objects.addAll(dtos3);
break;
case 3:
AnalysisEmployeeNumExample analysisEmployeeNumExample = new AnalysisEmployeeNumExample();
......@@ -96,7 +100,8 @@ public class AnalysisServiceImpl extends BaseService {
case 4:
AnalysisDriverNumExample analysisDriverNumExample = new AnalysisDriverNumExample();
analysisDriverNumExample.createCriteria().andPeriodEqualTo(period);
objects.addAll(analysisDriverNumMapper.selectByExample(analysisDriverNumExample));
List<AnalysisDriverNumDto> dtos4 = processDns(analysisDriverNumMapper.selectByExample(analysisDriverNumExample));
objects.addAll(dtos4);
break;
default:
break;
......@@ -144,6 +149,29 @@ public class AnalysisServiceImpl extends BaseService {
dtos.add(dto);
}
private List<AnalysisDriverNumDto> processDns(List<AnalysisDriverNum> list) {
List<AnalysisDriverNumDto> dtos = Lists.newArrayList();
list.forEach(l->{
AnalysisDriverNumDto dto1 = new AnalysisDriverNumDto();
dto1.setDriverType("加盟");
dto1.setDriverNum(l.getJoinInAmount());
AnalysisDriverNumDto dto2 = new AnalysisDriverNumDto();
dto2.setDriverType("自营");
dto2.setDriverNum(l.getSelfSupportAmount());
AnalysisDriverNumDto dto3 = new AnalysisDriverNumDto();
dto3.setDriverType("直营");
dto3.setDriverNum(l.getDirectSaleAmount());
AnalysisDriverNumDto dto4 = new AnalysisDriverNumDto();
dto4.setDriverType("对公");
dto4.setDriverNum(l.getRightPublicAmount());
dtos.add(dto1);
dtos.add(dto2);
dtos.add(dto3);
dtos.add(dto4);
});
return dtos;
}
private BigDecimal getTaxAmountByGroup(List<AnalysisActualTaxReturn> v, String group) {
List<AnalysisActualTaxReturn> filterRes = v.stream().filter(o-> group.equals(o.getTaxReturnGroup())).collect(Collectors.toList());
BigDecimal res = filterRes.size()>0?filterRes.get(0).getTaxReturnAmount():BigDecimal.ZERO;
......@@ -553,7 +581,7 @@ public class AnalysisServiceImpl extends BaseService {
}
}
public Object displayAnalysisInternationalImportData(AnalysisInternationlParam param) {
public List<Object> displayAnalysisInternationalImportData(AnalysisInternationlParam param) {
List<Object> objects = new ArrayList<>();
Integer period = DateUtils.strToPeriod(param.getPeriod());
String country = param.getCountry();
......@@ -614,31 +642,45 @@ public class AnalysisServiceImpl extends BaseService {
return objects;
}
public void downloadDomesticFile(HttpServletResponse response, AnalysisDomesticlParam param, String fileName) {
/*String excelTemplatePathInClassPath = ExportTemplatePathConstant.CERTIFIED_INVOICES_LIST;
CertifiedInvoicesListCondition condition = beanUtil.copyProperties(param, new CertifiedInvoicesListCondition());
List<CertifiedInvoicesList> datas = certifiedInvoicesListMapper.selectByCondition(condition);
public HttpServletResponse downloadDomesticFile(HttpServletResponse response, AnalysisDomesticlParam param, String fileName) {
String excelTemplatePathInClassPath = EnumAnalysisExpTempPath.getPath(param.getType());
List<Object> datas = displayAnalysisImportData(param.getType(),param.getPeriod());
if(datas.size()<1){
throw new ServiceException(ErrorMessage.ExportFailed);
}
CertifiedInvoicesListHeader header = new CertifiedInvoicesListHeader();
Organization org = organizationMapper.selectByPrimaryKey(param.getOrgId());
header.setTaxPayerNumber(org.getTaxPayerNumber());
header.setPeriod(param.getPeriodStart());
header.setUnit(datas.get(0).getUnit());
List<CertifiedInvoicesListDto> dtoList = Lists.newArrayList();
datas.forEach(cil -> {
CertifiedInvoicesListDto dto = beanUtil.copyProperties(cil, new CertifiedInvoicesListDto());
dtoList.add(dto);
});
OutputStream outputStream = commonDocumentHelper.toXlsxFileUsingJxls(header,dtoList, excelTemplatePathInClassPath);
OutputStream outputStream = commonDocumentHelper.toXlsxFileUsingJxls(datas, excelTemplatePathInClassPath);
try {
return responseMessageBuilder.getDownloadTmpResponseMessage(response, outputStream, fileName);
} catch (Exception e) {
logger.error(String.format("导出已认证发票清单异常:%s",e.getMessage()));
logger.error(String.format("导出国内税数据异常:%s",e.getMessage()));
}
return null;*/
return null;
}
public HttpServletResponse downloadInternationalFile(HttpServletResponse response, AnalysisInternationlParam param, String fileName) {
String excelTemplatePathInClassPath = EnumAnalysisExpTempPath.getPath(param.getType());
List<Object> datas = Lists.newArrayList();
if(param.getType().equals(EnumAnalysisImportType.InternationalBuData.getCode())){
Integer period = DateUtils.strToPeriod(param.getPeriod());
String country = param.getCountry();
String companyName = param.getCompanyName();
AnalysisInternationalBusinessDataExample analysisInternationalBusinessDataExample = new AnalysisInternationalBusinessDataExample();
analysisInternationalBusinessDataExample.createCriteria().andPeriodEqualTo(period).andCompanyNameEqualTo(companyName).andCountryEqualTo(country);
List<AnalysisInternationalBusinessData> list = analysisInternationalBusinessDataMapper.selectByExample(analysisInternationalBusinessDataExample);
datas.addAll(list);
}else{
datas = displayAnalysisInternationalImportData(param);
}
if(datas.size()<1){
throw new ServiceException(ErrorMessage.ExportFailed);
}
OutputStream outputStream = commonDocumentHelper.toXlsxFileUsingJxls(datas, excelTemplatePathInClassPath);
try {
return responseMessageBuilder.getDownloadTmpResponseMessage(response, outputStream, fileName);
} catch (Exception e) {
logger.error(String.format("导出国际税数据异常:%s",e.getMessage()));
}
return null;
}
public List<String> getAnalysisInternationalCompanyList(Integer type, String periodStr) {
......@@ -673,8 +715,6 @@ public class AnalysisServiceImpl extends BaseService {
return countryList;
}
private String getCellStringValue(Cell cell) {
if (cell.getCellTypeEnum().equals(CellType.STRING)) {
return cell.getStringCellValue();
......
......@@ -23,9 +23,9 @@ public class BaseService {
@Autowired
protected BeanUtil beanUtil;
@Autowired
protected RestTemplate restTemplate;/*
protected RestTemplate restTemplate;
@Autowired
protected CommonDocumentHelper commonDocumentHelper;*/
protected CommonDocumentHelper commonDocumentHelper;
@Autowired
protected ResponseMessageBuilder responseMessageBuilder;
......
......@@ -14,15 +14,12 @@ import pwc.taxtech.atms.common.OperationAction;
import pwc.taxtech.atms.common.OperationModule;
import pwc.taxtech.atms.common.message.ErrorMessageCN;
import pwc.taxtech.atms.dao.BusinessUnitMapper;
import pwc.taxtech.atms.dto.BusinessUnitDto;
import pwc.taxtech.atms.dto.BusinessUnitInputDto;
import pwc.taxtech.atms.dto.IdModel;
import pwc.taxtech.atms.dto.OperationLogDto;
import pwc.taxtech.atms.dto.UpdateLogParams;
import pwc.taxtech.atms.dto.*;
import pwc.taxtech.atms.entity.BusinessUnit;
import pwc.taxtech.atms.entity.BusinessUnitExample;
import pwc.taxtech.atms.entity.BusinessUnitExample.Criteria;
import pwc.taxtech.atms.exception.ApplicationException;
import pwc.taxtech.atms.exception.ServiceException;
import java.util.ArrayList;
import java.util.Date;
......@@ -56,17 +53,25 @@ public class BusinessUnitServiceImpl {
}
@Transactional
public void addBusinessUnits(List<BusinessUnitInputDto> businessUnitDtoList) {
public ApiResultDto addBusinessUnits(List<BusinessUnitInputDto> businessUnitDtoList) {
logger.debug("BusinessUnitServiceImpl addBusinessUnits");
ApiResultDto res = ApiResultDto.success();
if (businessUnitDtoList.isEmpty()) {
throw new ApplicationException(CommonConstants.JSONNULLOBJECT);
}
for (BusinessUnitInputDto businessUnitDto : businessUnitDtoList) {
addBusinessUnit(businessUnitDto);
res = addBusinessUnit(businessUnitDto);
if(ApiResultDto.FAILED == res.getCode()) break;
}
return res;
}
public void addBusinessUnit(BusinessUnitInputDto businessUnitDto) {
public ApiResultDto addBusinessUnit(BusinessUnitInputDto businessUnitDto) {
BusinessUnitExample example = new BusinessUnitExample();
example.createCriteria().andNameEqualTo(businessUnitDto.getName());
if(businessUnitMapper.countByExample(example)>0){
return ApiResultDto.fail(ErrorMessageCN.BusinssUnitRepeat);
}
BusinessUnit businessUnit = rotateBusinessUnitDtoForInput(businessUnitDto);
businessUnit.setId(CommonUtils.getUUID());
businessUnit.setCreateTime(new Date());
......@@ -80,6 +85,7 @@ public class BusinessUnitServiceImpl {
operationLogDto.setAction(OperationAction.New.value());
operationLogDto.setLogType(OperateLogType.OperationLogBasicData.value());
operationLogService.addOperationLog(operationLogDto);
return ApiResultDto.success();
}
@Transactional
......@@ -109,11 +115,11 @@ public class BusinessUnitServiceImpl {
}
@Transactional
public Boolean updateBusinessUnits(List<BusinessUnitDto> businessUnitDtoList) {
public ApiResultDto updateBusinessUnits(List<BusinessUnitDto> businessUnitDtoList) {
logger.debug("BusinessUnitServiceImpl updateBusinessUnits");
if (businessUnitDtoList.isEmpty()) {
throw new ApplicationException(CommonConstants.JSONNULLOBJECT);
return ApiResultDto.fail(CommonConstants.JSONNULLOBJECT);
}
for (BusinessUnitDto businessUnitDto : businessUnitDtoList) {
......@@ -121,16 +127,17 @@ public class BusinessUnitServiceImpl {
boolean isStatusChangeOperation = false;
if (businessUnitDto == null || !StringUtils.hasText(businessUnitDto.getId())) {
throw new ApplicationException("primary key can't be null");
return ApiResultDto.fail("primary key can't be null");
}
// current businessUnit
BusinessUnit businessUnit = businessUnitMapper.selectByPrimaryKey(businessUnitDto.getId());
if (businessUnit == null) {
throw new ApplicationException("can't find business unit, id: " + businessUnitDto.getId());
return ApiResultDto.fail("can't find business unit, id: " + businessUnitDto.getId());
}
if(businessUnit.getName().equals(businessUnitDto.getName())){
throw new ApplicationException(ErrorMessageCN.BusinssUnitRepeat);
if(businessUnitDto.getIsActive().equals(businessUnit.getIsActive())&&
businessUnit.getName().equals(businessUnitDto.getName())){
return ApiResultDto.fail(ErrorMessageCN.BusinssUnitUpdateFailed);
}
// copy current businessUnit as tmp
......@@ -163,8 +170,7 @@ public class BusinessUnitServiceImpl {
operationLogService.updateDataAddLog(updateLogParams);
}
}
return true;
return ApiResultDto.success();
}
private List<BusinessUnitDto> rotateBusinessUnitList(List<BusinessUnit> businessUnitList) {
......
......@@ -3232,6 +3232,16 @@ public class OrganizationServiceImpl extends BaseService{
}
}
public List<OrgCodeIdDto> getMyOrgCodeList() {
String uid = authUserHelper.getCurrentUserId();
User user = userMapper.selectByPrimaryKey(uid);
if (user.getIsSuperAdmin()) {
return organizationMapper.getAllOrgCodeList();
} else {
return organizationMapper.getMyOrgCodeList(uid);
}
}
public String queryBusinessByCompanyId(String companyId) {
return organizationMapper.queryBusinessByCompanyId(companyId);
}
......
......@@ -14,11 +14,7 @@ import pwc.taxtech.atms.common.OperationAction;
import pwc.taxtech.atms.common.OperationModule;
import pwc.taxtech.atms.common.message.ErrorMessageCN;
import pwc.taxtech.atms.dao.OrganizationStructureMapper;
import pwc.taxtech.atms.dto.IdModel;
import pwc.taxtech.atms.dto.OperationLogDto;
import pwc.taxtech.atms.dto.OrganizationStructureDto;
import pwc.taxtech.atms.dto.OrganizationStructureInputDto;
import pwc.taxtech.atms.dto.UpdateLogParams;
import pwc.taxtech.atms.dto.*;
import pwc.taxtech.atms.entity.OrganizationStructure;
import pwc.taxtech.atms.entity.OrganizationStructureExample;
import pwc.taxtech.atms.exception.ApplicationException;
......@@ -53,24 +49,26 @@ public class OrganizationStructureServiceImpl {
return rotateOrganizationStructureList(organizationStructureList);
}
public void addOrganizationStructures(List<OrganizationStructureInputDto> organizationStructureDtoList) {
public ApiResultDto addOrganizationStructures(List<OrganizationStructureInputDto> organizationStructureDtoList) {
logger.debug("OrganizationStructureService addOrganizationStructure");
logger.debug("organization structure to add: {}", JSON.toJSONString(organizationStructureDtoList, true));
ApiResultDto res = ApiResultDto.success();
if (organizationStructureDtoList.isEmpty()) {
throw new ApplicationException(CommonConstants.JSONNULLOBJECT);
return ApiResultDto.fail(CommonConstants.JSONNULLOBJECT);
}
for (OrganizationStructureInputDto organizationStructureDto : organizationStructureDtoList) {
addOrganizationStructure(organizationStructureDto);
res = addOrganizationStructure(organizationStructureDto);
if(ApiResultDto.FAILED == res.getCode()) break;
}
return res;
}
public void addOrganizationStructure(OrganizationStructureInputDto organizationStructureDto) {
public ApiResultDto addOrganizationStructure(OrganizationStructureInputDto organizationStructureDto) {
OrganizationStructureExample example = new OrganizationStructureExample();
example.createCriteria().andNameEqualTo(organizationStructureDto.getName());
if(organizationStructureMapper.countByExample(example)>0){
throw new ApplicationException(ErrorMessageCN.StrctureRepeat);
return ApiResultDto.fail(ErrorMessageCN.StrctureRepeat);
}
OrganizationStructure organizationStructure = rotateOrganizationStructureDto(organizationStructureDto);
organizationStructure.setId(CommonUtils.getUUID());
......@@ -84,6 +82,7 @@ public class OrganizationStructureServiceImpl {
operationLogDto.setOperationObject(organizationStructureDto.getName());
operationLogDto.setAction(OperationAction.New.value());
operationLogService.addOperationLog(operationLogDto);
return ApiResultDto.success();
}
private void makeUpOperationLogDto(OperationLogDto operationLogDto) {
......@@ -115,12 +114,12 @@ public class OrganizationStructureServiceImpl {
return result;
}
public Boolean updateOrganizationStructures(List<OrganizationStructureInputDto> organizationStructureDtoList) {
public ApiResultDto updateOrganizationStructures(List<OrganizationStructureInputDto> organizationStructureDtoList) {
logger.debug("OrganizationStructureService updateOrganizationStructures");
logger.debug("organization structure to update: {}", JSON.toJSONString(organizationStructureDtoList, true));
if (organizationStructureDtoList.isEmpty()) {
throw new ApplicationException(CommonConstants.JSONNULLOBJECT);
return ApiResultDto.fail(CommonConstants.JSONNULLOBJECT);
}
for (OrganizationStructureInputDto organizationStructureDto : organizationStructureDtoList) {
......@@ -128,14 +127,18 @@ public class OrganizationStructureServiceImpl {
boolean isStatusChangeOperation = false;
if (organizationStructureDto == null || !StringUtils.hasText(organizationStructureDto.getId())) {
throw new ApplicationException("primary key can't be null");
return ApiResultDto.fail("primary key can't be null");
}
// current OrganizationStructure
OrganizationStructure organizationStructure = organizationStructureMapper
.selectByPrimaryKey(organizationStructureDto.getId());
if (organizationStructure == null) {
throw new ApplicationException("can't find organizationStructure, id: " + organizationStructureDto.getId());
return ApiResultDto.fail("can't find organizationStructure, id: " + organizationStructureDto.getId());
}
if(organizationStructureDto.getIsActive().equals(organizationStructure.getIsActive())&&
organizationStructure.getName().equals(organizationStructureDto.getName())){
return ApiResultDto.fail(ErrorMessageCN.OrgStructureFailed);
}
//copy current OrganizationStructure as tmp
......@@ -147,12 +150,13 @@ public class OrganizationStructureServiceImpl {
isStatusChangeOperation = true;
organizationStructure.setIsActive(organizationStructureDto.getIsActive());
organizationStructure.setName(organizationStructureDto.getName());
if (!organizationStructureDto.getIsActive()&&
// 参照atms取消层级若有机构不能停用的限制
/*if (!organizationStructureDto.getIsActive()&&
organizationService.isOrganizationStructureExists(organizationStructureDto.getId())) {
// continue;
// return false;
throw new ApplicationException("the organization must not contain sub-organization!");
}
}*/
}
organizationStructure.setUpdateTime(new Date());
organizationStructureMapper.updateByPrimaryKey(organizationStructure);
......@@ -172,7 +176,7 @@ public class OrganizationStructureServiceImpl {
}
}
return true;
return ApiResultDto.success();
}
......
......@@ -51,8 +51,9 @@ public class RevenueConfService extends BaseService {
RevenueConfigExample example = new RevenueConfigExample();
example.createCriteria().andOrgIdEqualTo(param.getOrgId()).andStartDateLessThanOrEqualTo(param.getStartDate()).andEndDateGreaterThanOrEqualTo(param.getEndDate());
return revenueConfigMapper.selectByExample(example).stream()
.map( o -> beanUtil.copyProperties(o, new RevenueConfResult())).collect(Collectors.toList());
.map(o -> beanUtil.copyProperties(o, new RevenueConfResult())).collect(Collectors.toList());
}
/**
* 新增配置
*
......@@ -89,6 +90,12 @@ public class RevenueConfService extends BaseService {
revenueConfigMapper.updateByPrimaryKeySelective(parseEntity(config));
}
public void delConfig(List<Long> idList) {
if (!CollectionUtils.isEmpty(idList)) {
idList.forEach(id -> revenueConfigMapper.deleteByPrimaryKey(id));
}
}
private RevenueConfig parseEntity(RevenueConfig config) {
if (config.getAccountType() != RevenueConfEnum.AccountType.Account.getCode().intValue()) {
config.setTbSegment3(StringUtils.EMPTY);
......
package pwc.taxtech.atms.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import pwc.taxtech.atms.common.CommonUtils;
import pwc.taxtech.atms.dpo.OrgCodeIdDto;
import pwc.taxtech.atms.dpo.OrgSelectDto;
import pwc.taxtech.atms.dto.revenuconf.RevTypeAddDto;
import pwc.taxtech.atms.dto.revenuconf.RevenueConfParam;
import pwc.taxtech.atms.dto.revenuconf.RevenueTypeResult;
import pwc.taxtech.atms.vat.dao.RevenueTypeMappingMapper;
import pwc.taxtech.atms.vat.entity.RevenueTypeMapping;
import pwc.taxtech.atms.vat.entity.RevenueTypeMappingExample;
import javax.annotation.Resource;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import static pwc.taxtech.atms.constant.Constant.DEFAULT_END_DATE;
@Service
public class RevenueTypeMappingService extends BaseService {
@Resource
private RevenueTypeMappingMapper typeMappingMapper;
@Resource
private OrganizationServiceImpl organizationService;
/**
* 分页查询可查看的配置信息
*
* @param param RevenueConfParam
* @return PageInfo
*/
public PageInfo<RevenueTypeResult> queryPage(RevenueConfParam param) {
List<OrgSelectDto> orgDtoList = organizationService.getMyOrgList();
if (CollectionUtils.isEmpty(orgDtoList)) {
return new PageInfo<>();
}
Page page = PageHelper.startPage(param.getPageInfo().getPageIndex(), param.getPageInfo().getPageSize());
RevenueTypeMappingExample example = new RevenueTypeMappingExample();
example.createCriteria().andOrgIdIn(orgDtoList.stream().map(OrgSelectDto::getId).collect(Collectors.toList()));
PageInfo<RevenueTypeResult> pageInfo = new PageInfo<>(typeMappingMapper.selectByExample(example).stream()
.map(o -> beanUtil.copyProperties(o, new RevenueTypeResult())).collect(Collectors.toList()));
pageInfo.setTotal(page.getTotal());
return pageInfo;
}
/**
* 新增配置
*
* @param mapping RevenueTypeMapping
*/
public void addConfig(RevenueTypeMapping mapping) {
//todo 重复校验
mapping.setId(idService.nextId());
typeMappingMapper.insertSelective(mapping);
}
/**
* 前台批量新增
*
* @param addDto RevTypeAddDto
*/
public void addConfig(RevTypeAddDto addDto) {
if (!CollectionUtils.isEmpty(addDto.getOrgList())) {
addDto.getOrgList().forEach(id -> {
addDto.setId(idService.nextId());
addDto.setOrgId(id);
typeMappingMapper.insertSelective(addDto);
});
}
}
/**
* 更新配置
*
* @param mapping RevenueConfig
*/
public void updateConfig(RevenueTypeMapping mapping) {
//todo 重复校验
typeMappingMapper.updateByPrimaryKeySelective(mapping);
}
public void delConfig(List<Long> idList) {
if (!CollectionUtils.isEmpty(idList)) {
idList.forEach(id -> typeMappingMapper.deleteByPrimaryKey(id));
}
}
public void upload(MultipartFile file, Integer type) throws Exception {
InputStream inputStream = file.getInputStream();
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
List<RevenueTypeMapping> list = new ArrayList<>();
List<OrgCodeIdDto> orgDtoList = organizationService.getMyOrgCodeList();
for (int r = sheet.getFirstRowNum(); r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
String orgCode = row.getCell(0).getStringCellValue();
Optional<OrgCodeIdDto> optional = orgDtoList.stream().filter(o -> StringUtils.equals(o.getCode(), orgCode)).findFirst();
if (!optional.isPresent()) {
continue;
}
RevenueTypeMapping mapping = new RevenueTypeMapping();
mapping.setId(idService.nextId());
mapping.setOrgId(optional.get().getId());
mapping.setOuName(StringUtils.defaultString(row.getCell(1).getStringCellValue()));
mapping.setContent(StringUtils.defaultString(row.getCell(2).getStringCellValue()));
mapping.setTaxRate(new BigDecimal(row.getCell(3).getNumericCellValue()));
mapping.setRevenueTypeName(StringUtils.defaultString(row.getCell(4).getStringCellValue()));
mapping.setStartDate(StringUtils.defaultString(row.getCell(5).getStringCellValue()));
mapping.setEndDate(StringUtils.defaultString(row.getCell(6).getStringCellValue(), DEFAULT_END_DATE));
list.add(mapping);
}
if (1 == type) {
//todo 覆盖导入 具体覆盖哪些
}
if (!CollectionUtils.isEmpty(list)) {
List<List<RevenueTypeMapping>> batchList = CommonUtils.subListWithLen(list, CommonUtils.BATCH_NUM_2000);
batchList.forEach(l -> typeMappingMapper.batchInsert(l));
}
}
}
......@@ -46,6 +46,7 @@
<table tableName="profit_loss_statement_prc" domainObjectName="ProfitLossStatementPrc">
<property name="useActualColumnNames" value="false"/>
<property name="ignoreQualifiersAtRuntime" value="true"/>
<columnOverride column="status" javaType="java.lang.Integer" jdbcType="TINYINT"/>
</table>
<table tableName="profit_loss_statement_prc_manual" domainObjectName="ProfitLossStatementPrcManual">
......
......@@ -140,5 +140,12 @@ public interface OrganizationMapper extends MyMapper {
@Select("select id, name from organization;")
List<OrgSelectDto> getAllOrgSelectList();
@Select("select tb.id,tb.code from user_organization ta left join organization tb on ta.organization_id = tb.id " +
"where ta.user_id = #{uid}")
List<OrgCodeIdDto> getMyOrgCodeList(String uid);
@Select("select id, code from organization;")
List<OrgCodeIdDto> getAllOrgCodeList();
String queryBusinessByCompanyId(String companyId);
}
\ No newline at end of file
package pwc.taxtech.atms.dpo;
public class OrgCodeIdDto {
private String id;
private String code;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return this.code;
}
public void setCode(String code) {
this.code = code;
}
}
......@@ -105,4 +105,6 @@ public interface RevenueTypeMappingMapper extends MyVatMapper {
* @mbg.generated
*/
int updateByPrimaryKey(RevenueTypeMapping record);
int batchInsert(List<RevenueTypeMapping> list);
}
\ No newline at end of file
......@@ -99,6 +99,17 @@ public class RevenueTypeMapping extends BaseEntity implements Serializable {
*/
private String endDate;
/**
* Database Column Remarks:
* 状态 0:启用 1:停用
*
* This field was generated by MyBatis Generator.
* This field corresponds to the database column revenue_type_mapping.status
*
* @mbg.generated
*/
private Integer status;
/**
*
* This field was generated by MyBatis Generator.
......@@ -335,6 +346,30 @@ public class RevenueTypeMapping extends BaseEntity implements Serializable {
this.endDate = endDate == null ? null : endDate.trim();
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column revenue_type_mapping.status
*
* @return the value of revenue_type_mapping.status
*
* @mbg.generated
*/
public Integer getStatus() {
return status;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column revenue_type_mapping.status
*
* @param status the value for revenue_type_mapping.status
*
* @mbg.generated
*/
public void setStatus(Integer status) {
this.status = status;
}
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column revenue_type_mapping.create_by
......@@ -451,6 +486,7 @@ public class RevenueTypeMapping extends BaseEntity implements Serializable {
sb.append(", revenueTypeName=").append(revenueTypeName);
sb.append(", startDate=").append(startDate);
sb.append(", endDate=").append(endDate);
sb.append(", status=").append(status);
sb.append(", createBy=").append(createBy);
sb.append(", updateBy=").append(updateBy);
sb.append(", createTime=").append(createTime);
......
......@@ -736,6 +736,66 @@ public class RevenueTypeMappingExample {
return (Criteria) this;
}
public Criteria andStatusIsNull() {
addCriterion("`status` is null");
return (Criteria) this;
}
public Criteria andStatusIsNotNull() {
addCriterion("`status` is not null");
return (Criteria) this;
}
public Criteria andStatusEqualTo(Integer value) {
addCriterion("`status` =", value, "status");
return (Criteria) this;
}
public Criteria andStatusNotEqualTo(Integer value) {
addCriterion("`status` <>", value, "status");
return (Criteria) this;
}
public Criteria andStatusGreaterThan(Integer value) {
addCriterion("`status` >", value, "status");
return (Criteria) this;
}
public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
addCriterion("`status` >=", value, "status");
return (Criteria) this;
}
public Criteria andStatusLessThan(Integer value) {
addCriterion("`status` <", value, "status");
return (Criteria) this;
}
public Criteria andStatusLessThanOrEqualTo(Integer value) {
addCriterion("`status` <=", value, "status");
return (Criteria) this;
}
public Criteria andStatusIn(List<Integer> values) {
addCriterion("`status` in", values, "status");
return (Criteria) this;
}
public Criteria andStatusNotIn(List<Integer> values) {
addCriterion("`status` not in", values, "status");
return (Criteria) this;
}
public Criteria andStatusBetween(Integer value1, Integer value2) {
addCriterion("`status` between", value1, value2, "status");
return (Criteria) this;
}
public Criteria andStatusNotBetween(Integer value1, Integer value2) {
addCriterion("`status` not between", value1, value2, "status");
return (Criteria) this;
}
public Criteria andCreateByIsNull() {
addCriterion("create_by is null");
return (Criteria) this;
......
......@@ -14,6 +14,7 @@
<result column="revenue_type_name" jdbcType="VARCHAR" property="revenueTypeName" />
<result column="start_date" jdbcType="VARCHAR" property="startDate" />
<result column="end_date" jdbcType="VARCHAR" property="endDate" />
<result column="status" jdbcType="TINYINT" property="status" />
<result column="create_by" jdbcType="VARCHAR" property="createBy" />
<result column="update_by" jdbcType="VARCHAR" property="updateBy" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
......@@ -91,7 +92,7 @@
This element is automatically generated by MyBatis Generator, do not modify.
-->
id, org_id, ou_name, content, tax_rate, revenue_type_name, start_date, end_date,
create_by, update_by, create_time, update_time
`status`, create_by, update_by, create_time, update_time
</sql>
<select id="selectByExample" parameterType="pwc.taxtech.atms.vat.entity.RevenueTypeMappingExample" resultMap="BaseResultMap">
<!--
......@@ -146,14 +147,14 @@
-->
insert into revenue_type_mapping (id, org_id, ou_name,
content, tax_rate, revenue_type_name,
start_date, end_date, create_by,
update_by, create_time, update_time
)
start_date, end_date, `status`,
create_by, update_by, create_time,
update_time)
values (#{id,jdbcType=BIGINT}, #{orgId,jdbcType=VARCHAR}, #{ouName,jdbcType=VARCHAR},
#{content,jdbcType=VARCHAR}, #{taxRate,jdbcType=DECIMAL}, #{revenueTypeName,jdbcType=VARCHAR},
#{startDate,jdbcType=VARCHAR}, #{endDate,jdbcType=VARCHAR}, #{createBy,jdbcType=VARCHAR},
#{updateBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}
)
#{startDate,jdbcType=VARCHAR}, #{endDate,jdbcType=VARCHAR}, #{status,jdbcType=TINYINT},
#{createBy,jdbcType=VARCHAR}, #{updateBy,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP},
#{updateTime,jdbcType=TIMESTAMP})
</insert>
<insert id="insertSelective" parameterType="pwc.taxtech.atms.vat.entity.RevenueTypeMapping">
<!--
......@@ -186,6 +187,9 @@
<if test="endDate != null">
end_date,
</if>
<if test="status != null">
`status`,
</if>
<if test="createBy != null">
create_by,
</if>
......@@ -224,6 +228,9 @@
<if test="endDate != null">
#{endDate,jdbcType=VARCHAR},
</if>
<if test="status != null">
#{status,jdbcType=TINYINT},
</if>
<if test="createBy != null">
#{createBy,jdbcType=VARCHAR},
</if>
......@@ -279,6 +286,9 @@
<if test="record.endDate != null">
end_date = #{record.endDate,jdbcType=VARCHAR},
</if>
<if test="record.status != null">
`status` = #{record.status,jdbcType=TINYINT},
</if>
<if test="record.createBy != null">
create_by = #{record.createBy,jdbcType=VARCHAR},
</if>
......@@ -310,6 +320,7 @@
revenue_type_name = #{record.revenueTypeName,jdbcType=VARCHAR},
start_date = #{record.startDate,jdbcType=VARCHAR},
end_date = #{record.endDate,jdbcType=VARCHAR},
`status` = #{record.status,jdbcType=TINYINT},
create_by = #{record.createBy,jdbcType=VARCHAR},
update_by = #{record.updateBy,jdbcType=VARCHAR},
create_time = #{record.createTime,jdbcType=TIMESTAMP},
......@@ -346,6 +357,9 @@
<if test="endDate != null">
end_date = #{endDate,jdbcType=VARCHAR},
</if>
<if test="status != null">
`status` = #{status,jdbcType=TINYINT},
</if>
<if test="createBy != null">
create_by = #{createBy,jdbcType=VARCHAR},
</if>
......@@ -374,6 +388,7 @@
revenue_type_name = #{revenueTypeName,jdbcType=VARCHAR},
start_date = #{startDate,jdbcType=VARCHAR},
end_date = #{endDate,jdbcType=VARCHAR},
`status` = #{status,jdbcType=TINYINT},
create_by = #{createBy,jdbcType=VARCHAR},
update_by = #{updateBy,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=TIMESTAMP},
......@@ -398,4 +413,40 @@
order by ${orderByClause}
</if>
</select>
<insert id="batchInsert" parameterType="pwc.taxtech.atms.vat.entity.RevenueTypeMapping">
insert into revenue_type_mapping (id, org_id, ou_name,
content, tax_rate, revenue_type_name,
start_date, end_date, `status`
<if test="createBy != null">
,create_by
</if>
<if test="updateBy != null">
,update_by
</if>
<if test="createTime != null">
,create_time
</if>
<if test="updateTime != null">
,update_time
</if>) values
<foreach collection="list" item="item" index="index" separator=",">
(#{id,jdbcType=BIGINT}, #{orgId,jdbcType=VARCHAR}, #{ouName,jdbcType=VARCHAR},
#{content,jdbcType=VARCHAR}, #{taxRate,jdbcType=DECIMAL}, #{revenueTypeName,jdbcType=VARCHAR},
#{startDate,jdbcType=VARCHAR}, #{endDate,jdbcType=VARCHAR}, #{status,jdbcType=TINYINT}
<if test="createBy != null">
,create_by = #{createBy,jdbcType=VARCHAR}
</if>
<if test="updateBy != null">
,update_by = #{updateBy,jdbcType=VARCHAR}
</if>
<if test="createTime != null">
,create_time = #{createTime,jdbcType=TIMESTAMP}
</if>
<if test="updateTime != null">
,update_time = #{updateTime,jdbcType=TIMESTAMP}
</if>)
</foreach>
</insert>
</mapper>
\ No newline at end of file
......@@ -1528,6 +1528,24 @@ var dataImpModule = angular.module('app.dataImp', ['ui.grid', 'ui.router','ui.gr
sticky: true
});
$stateProvider.state({
name: 'dataImportConfigRevenueTypeMapping',
url: "/dataImportConfig/revenueTypeMapping",
dsr: true,
views: {
'importContent': {
controller: ['$scope', '$state','appTranslation',
function ($scope, $state, appTranslation) {
$scope.state = $state;
appTranslation.load([appTranslation.appPart]);
}],
template: '<vat-revenue-conf-mapping></vat-revenue-conf-mapping>'
}
},
resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.dataImp),
sticky: true
});
$stateProvider.state({
name: 'citProfitPrcAdjustImportDistribution',
url: "/importDistribution/citProfitPrcAdjust",
......
......@@ -1912,5 +1912,6 @@
"Country": "Country",
"Company": "Company",
"CompanySimpleName": "Company Simple Name",
"DriverType": "Driver Type",
"~MustBeEndOneApp": "I Must be the End One, please!"
}
\ No newline at end of file
......@@ -2150,6 +2150,7 @@
"RevenueNoOrgData": "没有机构权限",
"RevenueGetOrgError": "获取机构信息失败",
"RevenueAddSuccess": "添加成功",
"RevenueDelSuccess": "删除成功",
"RevenueUpdateSuccess": "更新成功",
"dataValidate": "数据校验",
"RevDetail": "收入明细",
......@@ -2177,6 +2178,10 @@
"RevDetailType": "收入类型",
"RevDetailCategory": "收入类别",
"RevDetailTaxOn": "计税方法",
"RevCMTitle": "开票记录与收入类型映射配置",
"RevCMApplyBU": "申请部门",
"RevCMInvoiceCTX": "开票内容",
"BillDetail": "开票明细",
"BillEditRevenueType": "编辑收入类型",
"BillDtlHandle": "操作",
......@@ -2270,6 +2275,7 @@
"Company": "公司",
"CompanySimpleName": "公司简称",
"DriverType": "司机类型",
"~MustBeEndOneApp": "我必须是最后一个!"
}
}
\ No newline at end of file
......@@ -60,7 +60,7 @@
var businessUnitArray = [];
businessUnitArray.push($scope.editingObject);
var successedFun = function(rst) {
var successedFun = function() {
$scope.refreshData();
......@@ -71,14 +71,25 @@
} else {
SweetAlert.success($translate.instant("OrganizationStructureAddSuccess"));
}
}
};
if ($scope.isEdit) {
businessUnitService.updateBusinessUnit(businessUnitArray).success(successedFun);
businessUnitService.updateBusinessUnit(businessUnitArray).success(function (data) {
if (data.code===0) {
successedFun();
}else {
SweetAlert.error(data.message);
}
});
} else {
businessUnitService.addBusinessUnit(businessUnitArray).success(successedFun);
businessUnitService.addBusinessUnit(businessUnitArray).success(function (data) {
if (data.code===0) {
successedFun();
}else {
SweetAlert.error(data.message);
}
});
}
};
......@@ -208,7 +219,7 @@
function intiValidate() {
$.validator.addMethod("BURepeated", function(value, element, param) {
/*后台校验$.validator.addMethod("BURepeated", function(value, element, param) {
if ($scope.gridOptions.data && $scope.gridOptions.data.length > 0) {
var objects = $.grep($scope.gridOptions.data, function(n, i) {
return $scope.editingObject.ID != n.id && $.trim(n.name) == $.trim(value);
......@@ -219,7 +230,7 @@
return true;
});
});*/
formValidator = $(editModalSelector).find("#edit-form").validate({
debug: true,
......@@ -228,8 +239,8 @@
Name: {
required: true,
minlength: 2,
maxlength: 50,
BURepeated: true
maxlength: 50
// BURepeated: true
},
IsActive: {
required: "input[name='IsActive']:checked"
......@@ -239,8 +250,8 @@
Name: {
required: $translate.instant('BusinessUnitEmptyNode'),
minlength: $translate.instant('BusinessUnitEmptyNode'),
maxlength: $translate.instant('BusinessUnitOutOfLengthNode'),
BURepeated: $translate.instant('TaxData')
maxlength: $translate.instant('BusinessUnitOutOfLengthNode')
// BURepeated: $translate.instant('BusinessUnitDuplicateNode')
},
IsActive: $translate.instant('BusinessUnitStatusUnsureness')
},
......
......@@ -31,7 +31,7 @@
<label class="col-sm-3 control-label">{{'BusinessUnitName' | translate}}:</label>
<div class="col-sm-6">
<input class="form-control" name="Name" ng-model="editingObject.Name" maxlength="50">
<div class="validate-success" data-for="Name"></div>
<!--<div class="validate-success" data-for="Name"></div>-->
</div>
</div>
......
......@@ -65,7 +65,7 @@
var osArray = [];
osArray.push($scope.editingObject);
var successedFun = function(rst) {
var successedFun = function() {
$scope.refreshData();
$(editModalSelector).modal('hide');
......@@ -78,9 +78,21 @@
}
if ($scope.isEdit) {
organizationStructureService.updateOrganizationStructure(osArray).success(successedFun);
organizationStructureService.updateOrganizationStructure(osArray).success(function (data) {
if (data.code===0) {
successedFun();
}else {
SweetAlert.error(data.message);
}
});
} else {
organizationStructureService.addOrganizationStructure(osArray).success(successedFun);
organizationStructureService.addOrganizationStructure(osArray).success(function (data) {
if (data.code===0) {
successedFun();
}else {
SweetAlert.error(data.message);
}
});
}
};
......
analysisModule.controller('domesticDataImportController', ['$scope', '$log', '$translate', '$timeout', '$q', '$interval'
analysisModule.controller('domesticDataImportController', ['$scope','$filter', '$log', '$translate', '$timeout', '$q', '$interval'
, 'apiInterceptor', 'Upload', 'vatImportService', 'SweetAlert', 'uiGridConstants', '$uibModal'
, 'vatSessionService', 'enums', 'vatOperationLogService'
, 'projectService', 'vatCommonService','templateService','orgService',
function ($scope, $log, $translate, $timeout, $q, $interval
function ($scope,$filter, $log, $translate, $timeout, $q, $interval
, apiInterceptor, Upload, vatImportService, SweetAlert, uiGridConstants, $uibModal
, vatSessionService, enums, vatOperationLogService
, projectService, vatCommonService,templateService,orgService) {
......@@ -163,12 +163,15 @@
fileName = m.name + $scope.UploadPeriodTime+"_" +localDate;
}
});
vatImportService.downloadDomesticFile($scope.queryParams,fileName).then(function (data) {
var downloadParam = {
type: $scope.importType,
period: $scope.UploadPeriodTime
};
vatImportService.downloadDomesticFile(downloadParam,fileName).then(function (data) {
if (data) {
ackMessageBox.success(translate('FileExportSuccess'));
}
});
};
//导入事件
......@@ -380,7 +383,7 @@
var getImportTax = function () {
vatImportService.displayAnalysisImportData($scope.importType,$scope.UploadPeriodTime).success(function (data) {
if (data.data) {
$scope.taxGridSource = data.data[0];
$scope.taxGridSource = data.data;
}else {
SweetAlert.error($translate.instant('SystemError'));
}
......@@ -472,7 +475,7 @@
var getImportReturnTax = function () {
vatImportService.displayAnalysisImportData($scope.importType,$scope.UploadPeriodTime).success(function (data) {
if (data.data) {
$scope.returnTaxGridSource = data.data[0];
$scope.returnTaxGridSource = data.data;
}else {
SweetAlert.error($translate.instant('SystemError'));
}
......@@ -569,7 +572,7 @@
var getImportGMVSubsidy = function () {
vatImportService.displayAnalysisImportData($scope.importType,$scope.UploadPeriodTime).success(function (data) {
if (data.data) {
$scope.GMVSubsidyGridSource = data.data[0];
$scope.GMVSubsidyGridSource = data.data;
}else {
SweetAlert.error($translate.instant('SystemError'));
}
......@@ -680,25 +683,15 @@
allowHeaderFiltering: false,
caption: $translate.instant('id')
}, {
dataField: "joinInAmount",
width: '25%',
allowHeaderFiltering: false,
caption: $translate.instant('JoinInAmount')
}, {
dataField: "selfSupportAmount",
dataField: "driverType",
width: '50%',
allowHeaderFiltering: false,
caption: $translate.instant('SelfSupportAmount'),
width: '25%'
caption: $translate.instant('DriverType')
}, {
dataField: "directSaleAmount",
dataField: "driverNum",
allowHeaderFiltering: false,
width: '25%',
caption: $translate.instant('DirectSaleAmount')
}, {
dataField: "rightPublicAmount",
allowHeaderFiltering: false,
width: '25%',
caption: $translate.instant('RightPublicAmount')
caption: $translate.instant('DriverNum'),
width: '50%'
}],
onContentReady: function (e) {
$scope.driverNumInstance = e.component;
......
analysisModule.controller('internationalDataImportController', ['$scope', '$log', '$translate', '$timeout', '$q', '$interval'
analysisModule.controller('internationalDataImportController', ['$scope','$filter', '$log', '$translate', '$timeout', '$q', '$interval'
, 'apiInterceptor', 'Upload', 'vatImportService', 'SweetAlert', 'uiGridConstants', '$uibModal'
, 'vatSessionService', 'enums', 'vatOperationLogService'
, 'projectService', 'vatCommonService','templateService','orgService',
function ($scope, $log, $translate, $timeout, $q, $interval
function ($scope,$filter, $log, $translate, $timeout, $q, $interval
, apiInterceptor, Upload, vatImportService, SweetAlert, uiGridConstants, $uibModal
, vatSessionService, enums, vatOperationLogService
, projectService, vatCommonService,templateService,orgService) {
......@@ -167,7 +167,22 @@
};
var doExport = function () {
var localDate=$filter('date')(new Date(), 'yyyyMMddHHmmss');
var fileName = '';
constant.anlDownLoadFileNameList.forEach(function (m) {
if (m.code === $scope.importType) {
fileName = m.name + $scope.UploadPeriodTime+"_" +localDate;
}
});
param.companyName = $scope.selectCompany;
param.country = $scope.selectCountry;
param.type = $scope.importType;
param.period = $scope.UploadPeriodTime;
vatImportService.downloadInternationalFile(param,fileName).then(function (data) {
if (data) {
ackMessageBox.success(translate('FileExportSuccess'));
}
});
};
......
webservices.factory('vatImportService', ['$http', 'apiConfig', 'vatSessionService', function ($http, apiConfig, vatSessionService) {
webservices.factory('vatImportService', ['$http', 'apiConfig', 'vatSessionService','FileSaver', function ($http, apiConfig, vatSessionService,FileSaver) {
'use strict';
return {
sample: function () {
......@@ -425,6 +425,14 @@
var data = new Blob([response.data], {type: response.headers('Content-Type')});
FileSaver.saveAs(data, fileName + '.xlsx');
});
},
downloadInternationalFile: function (queryParm, fileName) {
var thisConfig = apiConfig.create();
thisConfig.responseType = "arraybuffer";
return $http.post('/Analysis/downloadInternationalFile/get', queryParm, thisConfig).then(function (response) {
var data = new Blob([response.data], {type: response.headers('Content-Type')});
FileSaver.saveAs(data, fileName + '.xlsx');
});
}
/***************************************批量数据导入服务(真) end**************************************************************/
......
<div class="vat-revenue-conf-mapping">
<!--标题-->
<div class="nav-wrapper">
<div class="nav-header" translate="RevCMTitle"></div>
</div>
<div id="tab_total">
<form class="form-inline">
<div class="form-group">
<button type="button" class="btn btn-secondary" ng-click="addConfig()">{{'RevenueAddBtn' | translate }}</button>&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-third" ng-click="delConfig()">{{'RevenueDelBtn' | translate }}</button>&nbsp;&nbsp;&nbsp;
<label class="control-label">文件:</label>
<input class="form-control" type="text" name="fileName" ng-model="uploadFile.file.name" readonly placeholder=""/>
<button type="button" type="file" ngf-select ng-model="uploadFile.file" accept=".xls,.xlsx" class="btn btn-secondary browse">{{'SelectFile' | translate }}</button>
<button type="button" class="btn btn-secondary" translate="CoverImportBtn" ng-click="upload()"></button>
<button type="button" class="btn btn-secondary" translate="AddImportBtn" ng-click="upload()"></button>
<button type="button" class="btn btn-in-grid inline-div" ng-click="downEntepriseAccountTemplate()"><i
class="fa fa-download" aria-hidden="true"></i>下载模板
</button>
</div>
</form>
<div class="dt-init-wrapper">
<div class="dx-viewport grid-container">
<div id="revenueGridContainer" dx-data-grid="revenueGridOptions"
style="margin-top: 0px;">
<div data-options="dxTemplate:{ name:'editCellTemplate' }">
</div>
</div>
</div>
<div class="page-footer">
<ack-pagination page-options="pagingOptions"
refresh-table="refreshConfigGrid()"></ack-pagination>
</div>
</div>
</div>
<div class="modal fade" id="revenueTypeAddDiv" tabindex="-1" role="dialog">
<div class="modal-dialog" style="width: 1200px;" role="document">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" id="modal-title">
<span translate="RevCMTitle"></span>
</h3>
</div>
<div class="modal-body" id="modal-body">
<form class="form-horizontal" id="configForm">
<div class="form-group">
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevenueColOrg' | translate}}:</label>
<div class="col-sm-4">
<div dx-tag-box="selectOrgOptions"></div>
</div>
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevCMApplyBU' | translate}}:</label>
<div class="col-sm-4">
<input class="form-control" name="name" ng-model="formParam.ouName" maxlength="255">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevCMInvoiceCTX' | translate}}:</label>
<div class="col-sm-4">
<input class="form-control" name="name" ng-model="formParam.content" maxlength="255">
</div>
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevenueColTaxRate' | translate}}:</label>
<div class="col-sm-4">
<div dx-select-box="selectTaxRateOptions"></div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevDetailType' | translate}}:</label>
<div class="col-sm-4">
<input class="form-control" name="name" ng-model="formParam.revenueTypeName" maxlength="255">
</div>
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevenueColStatus' | translate}}:</label>
<div class="col-sm-4">
<div dx-select-box="selectStatusOptions"></div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevenueColEnable' | translate}}:</label>
<div class="col-sm-4">
<div dx-date-box="dateBoxStart"></div>
</div>
<label class="col-sm-2 control-label"><span style="color: red">*</span>{{'RevenueColDisable' | translate}}:</label>
<div class="col-sm-4">
<div dx-date-box="dateBoxEnd"></div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" ng-click="saveConfig()">{{'Confirm' | translate }}</button>
<button type="button" class="btn btn-third" data-dismiss="modal" ng-click="cancelModal()">{{'Cancel' | translate }}</button>
</div>
</div>
</div>
</div>
</div>
citModule.directive('vatRevenueConfMapping', ['$log', 'browserService', '$translate', 'region', '$timeout',
function ($log, browserService, $translate, region, $timeout) {
$log.debug('vatPreviewProfitLoss.ctor()...');
return {
restrict: 'E',
templateUrl: '/app/dataImport/vat-revenue-conf-mapping/vat-revenue-conf-mapping.html' + '?_=' + Math.random(),
scope: {},
controller: 'VatRevenueConfMappingController',
link: function ($scope, element) {
$('.main-contents')[0].style.width = "260px";
$('.data-import-contents')[0].style.display = "block";
$('.main-contents')[0].style.float = "left";
$('.main-contents')[0].style.styleFloat = "left";
$('.main-contents')[0].style.cssFloat = "left";
}
}
}
]);
\ No newline at end of file
@import "~/app-resources/less/theme.less";
.vat-revenue-conf-mapping {
/*background-color: @color-white;*/
padding-left: 20px;
/*min-height: 800px;*/
height: 96%;
.nav-wrapper {
/*padding-bottom: 5px;
border-bottom: 1px solid #DBD8D3;*/
.nav-header {
height: 54px;
line-height: 54px;
font-family: "Microsoft YaHei Bold", "Microsoft YaHei Regular", "Microsoft YaHei";
font-weight: 700;
font-style: normal;
font-size: 15px;
color: #333;
display: inline-block;
}
.nav-tab {
span {
display: inline-block;
height: 34px;
line-height: 34px;
padding: 0 10px;
background-color: #B90808;
color: #FFF;
font-family: "Microsoft YaHei";
font-weight: 400;
font-style: normal;
font-size: 14px;
cursor: pointer;
}
.active {
background-color: #F91000;
}
}
.alert-warning {
background-color: #FDE2DE;
cursor: pointer;
}
.alert {
color: #CF2D1B;
font-weight: bold;
display: inline-block;
padding: 5px;
margin-left: 60px;
margin-bottom: 0px;
i {
font-size: 20px;
vertical-align: middle;
margin-right: 5px;
}
}
.operation-wrapper {
margin: 15px 25px 10px 10px;
span {
cursor: pointer;
}
}
}
.dropdown-common() {
display: inline-block;
.select-button {
background-color: #F5F5F5;
padding: 6px 0;
width: 100px;
}
.caret {
margin-top: 8px;
}
.dropdown-menu {
min-width: 100px;
li {
text-align: center;
min-height: 0px;
height: 30px;
line-height: 30px;
color: #000;
font-weight: normal;
&:hover {
background-color: #F91000;
color: #FFF;
}
}
}
}
#tab_total {
display: block;
height: calc(~'100% - 40px');
position: relative;
.import-wrapper {
span {
margin-left: 10px;
color: #333;
font-family: "Microsoft YaHei";
font-style: normal;
font-size: 14px;
font-weight: bold;
}
.period-picker {
width: 150px;
border: 1px solid #c7c5c0;
display: inline-block;
line-height: 20px;
margin-top: 7px;
}
.imp-subheader {
display: inline-block;
font-size: 15px;
height: 30px;
line-height: 30px;
vertical-align: middle;
border: none;
select {
appearance: none;
-moz-appearance: none;
-webkit-appearance: none;
background: transparent;
}
}
.dropdown {
.dropdown-common();
}
input {
width: 50px;
outline: none;
border-radius: 3px;
border: 1px solid #3c3a36;
padding: 2px;
text-align: center;
}
> button:last-child {
float: right;
margin-right: 20px;
}
.btn-wrapper {
border-radius: 5px;
background-color: #e0301e;
color: #FFF;
display: inline-block;
float: right;
margin-right: 10px;
.btn-vat-primary {
min-width: 80px;
}
}
}
.dt-init-wrapper {
margin: 30px 0;
max-width: 99%;
height: calc(~'100% - 25px');
position: relative;
.dropdown {
.dropdown-common();
i {
color: #F85550;
}
}
.importPLStatusGridContainer {
height: calc(~'100% - 30px');
overflow: hidden;
position: absolute;
top: 0;
bottom: 136px; /* 130 + 6 */
left: 0;
right: 0;
background-color: #FFF;
}
}
.error-info-wrapper {
position: absolute;
height: 150px;
bottom: 0;
left: 0;
right: 0;
overflow: hidden;
background-color: #FFF;
margin-left: -40px;
}
#content-resizer {
width: 110%;
position: absolute;
height: 4px;
bottom: 150px;
left: 0;
right: 0;
background-color: red;
cursor: n-resize;
margin-left: -40px;
#topIcon {
cursor: pointer;
margin-top: -19px;
width: 38px;
margin-left: 46%;
z-index: 999;
bottom: -381px;
text-align: center;
display: block !important;
}
}
.dt-import-wrapper {
margin: 60px 0;
max-width: 99%;
overflow: auto;
height: calc(~"100% - 35px");
.dropdown {
.dropdown-common();
i {
color: #F85550;
}
}
}
}
.error-list-modal {
.modal-title {
color: #FF0000;
}
.modal-body {
max-height: 300px;
overflow-y: auto;
table {
border: 1px solid #CCC;
thead tr th {
height: 30px;
border: 1px solid #CCC;
}
tbody tr td {
height: 25px;
border: 1px solid #CCC;
}
}
}
.modal-footer {
text-align: center;
}
}
#tab_detail {
display: none;
}
/*覆写ack-pagination.less中:.page-size, .pagination 中的margin演示 */
.page-form-group{
float:right;
.page-size{
margin:0;
}
.pagination {
margin:0;
}
}
}
.tb-model-period-dropdow-popup {
width: 400px;
height: 500px;
position: fixed;
top: 25%;
left: 40%;
.modal-dialog {
width: 100%;
height: 90%;
margin: 20px auto;
.modal-content {
width: 100%;
.modal-body {
height: 90%;
}
}
}
}
#totalWrapper {
margin: 5px 10px 10px -10px;
width: 100%;
padding-left: 10px;
font-family: Microsoft YaHei;
font-size: 13px;
float:right;
.total_span{
color: #B4122A !important;
background-color:#ddd !important;
font-size: 12px !important;
font-weight:bold !important;
border-radius:10px !important;
padding-left: 8px !important;
padding-right: 8px !important;
}
.total-column{
width:15%;
float:left;
padding-left: 15px;
}
}
\ No newline at end of file
......@@ -6,7 +6,7 @@
//表格配置
$scope.revenueGridOptions = $.extend(true, {}, dxDataGridService.BASIC_GRID_OPTIONS, {
columns: [
// {dataField: 'serialNo', caption: $translate.instant('RevenueColSerialNo'), fixed: true, allowHeaderFiltering: true},
{dataField: 'idStr', caption: '', visible: false},
{dataField: 'name', caption: $translate.instant('RevenueColName'), fixed: true, allowHeaderFiltering: true, minWidth: '300px'},
{dataField: 'orgId', caption: $translate.instant('RevenueColOrg'), fixed: true, allowHeaderFiltering: true, minWidth: '300px',
calculateCellValue: function(data) {
......@@ -35,7 +35,7 @@
}).appendTo(container);
$('<i class="fa fa-trash" style="cursor: pointer;margin-left: 5px;"></i>')
.on('click', function () {
$scope.editConfig(options.data);
$scope.delConfig([options.data.idStr]);
}).appendTo(container);
}
catch (e) {
......@@ -50,7 +50,11 @@
mode: 'multiple',
showCheckBoxesMode: 'always',
allowSelectAll: true
}
},
onSelectionChanged: function (data) {
$scope.selectedItems = data.selectedRowsData;
$scope.selectedRecourdCount = data.selectedRowsData.length;
},
});
//刷新页面
......@@ -74,8 +78,24 @@
};
//删除配置
$scope.delConfig = function () {
SweetAlert.info('del');
$scope.delConfig = function (idList) {
$http.post('/revenueConf/del',idList, apiConfig.createVat())
.success(function (res) {
if (res && 0 === res.code) {
SweetAlert.success($translate.instant('RevenueDelSuccess'));
$scope.refreshConfigGrid();
}else {
SweetAlert.error($translate.instant('SystemError'));
}
})
};
$scope.batchDelConfig = function () {
if (!!$scope.selectedRecourdCount) {
$scope.delConfig(_.map($scope.selectedItems, function(item){ return item.idStr; }));
}else {
SweetAlert.warning($translate.instant('PleaseSelectAtLeastOneItem'));
}
};
//添加配置
......
......@@ -7,7 +7,7 @@
<form class="form-inline">
<div class="form-group"><div class="import-wrapper">
<button type="button" class="btn btn-primary" ng-click="addConfig()">{{'RevenueAddBtn' | translate }}</button>&nbsp;&nbsp;&nbsp;
<button type="button" class="btn btn-third" ng-click="delConfig()">{{'RevenueDelBtn' | translate }}</button>
<button type="button" class="btn btn-third" ng-click="batchDelConfig()">{{'RevenueDelBtn' | translate }}</button>
</div></div>
</form>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment