提交 44b9c1b6 authored 作者: 000516's avatar 000516

店内执行-城市经理看板,不返回没有城市经理的信息;

...@@ -25,7 +25,8 @@ public class ControllerResponseAdvice implements ResponseBodyAdvice<Object>{ ...@@ -25,7 +25,8 @@ public class ControllerResponseAdvice implements ResponseBodyAdvice<Object>{
*/ */
@Override @Override
public boolean supports(MethodParameter methodParameter, Class converterType) { public boolean supports(MethodParameter methodParameter, Class converterType) {
if (methodParameter.getParameterType().isAssignableFrom(AjaxResult.class)) { String parameterName = methodParameter.getParameterType().getCanonicalName();
if ("com.sfa.common.core.web.domain.AjaxResult".equals(parameterName)) {
return false; return false;
} }
return !methodParameter.getParameterType().isAssignableFrom(R.class); return !methodParameter.getParameterType().isAssignableFrom(R.class);
......
...@@ -23,16 +23,14 @@ import java.util.Optional; ...@@ -23,16 +23,14 @@ import java.util.Optional;
* @describe : 常规陈列、档期陈列、零食陈列 * @describe : 常规陈列、档期陈列、零食陈列
*/ */
@RestController @RestController
@RequestMapping("/sales/ap_display")
public class ApDisplayCoreController { public class ApDisplayCoreController {
@Autowired @Autowired
private IApDisplayCoreService apDisplayCoreService; private IApDisplayCoreService apDisplayCoreService;
@Autowired
private IQinceMarketEmployeeService qinceMarketEmployeeService;
/** /**
* 常规陈列 根据id更新 * 常规陈列 根据id更新
*/ */
@PutMapping("/core/{id}") @PutMapping("/sales/ap_display/core/{id}")
@RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR) @RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR)
public void putDetail(@PathVariable("id") Long sadId, @RequestBody SalesApRequest request){ public void putDetail(@PathVariable("id") Long sadId, @RequestBody SalesApRequest request){
// checkPermission(); // checkPermission();
...@@ -43,7 +41,7 @@ public class ApDisplayCoreController { ...@@ -43,7 +41,7 @@ public class ApDisplayCoreController {
/** /**
* 档期陈列 根据id更新 * 档期陈列 根据id更新
*/ */
@PutMapping("/core_pro/{id}") @PutMapping("/sales/ap_display/core_pro/{id}")
@RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR) @RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR)
public void putProDisplayDetail(@PathVariable("id") Long sapdId, @RequestBody SalesApRequest request){ public void putProDisplayDetail(@PathVariable("id") Long sapdId, @RequestBody SalesApRequest request){
// checkPermission(); // checkPermission();
...@@ -54,7 +52,7 @@ public class ApDisplayCoreController { ...@@ -54,7 +52,7 @@ public class ApDisplayCoreController {
/** /**
* 零食陈列 根据id更新 * 零食陈列 根据id更新
*/ */
@PutMapping("/core_snack/{id}") @PutMapping("/sales/ap_display/core_snack/{id}")
@RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR) @RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR)
public void putSnackDisplayDetail(@PathVariable("id") Long sasdId, @RequestBody SalesApRequest request){ public void putSnackDisplayDetail(@PathVariable("id") Long sasdId, @RequestBody SalesApRequest request){
// checkPermission(); // checkPermission();
...@@ -65,7 +63,7 @@ public class ApDisplayCoreController { ...@@ -65,7 +63,7 @@ public class ApDisplayCoreController {
/** /**
* 三米两秒 * 三米两秒
*/ */
@PutMapping("/core_s/{id}") @PutMapping("/sales/ap_display/core_s/{id}")
@RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR) @RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR)
public void putDisplaySDetail(@PathVariable("id") Long sadsId, @RequestBody SalesApRequest request){ public void putDisplaySDetail(@PathVariable("id") Long sadsId, @RequestBody SalesApRequest request){
// checkPermission(); // checkPermission();
...@@ -76,7 +74,7 @@ public class ApDisplayCoreController { ...@@ -76,7 +74,7 @@ public class ApDisplayCoreController {
/** /**
* 六小金刚 * 六小金刚
*/ */
@PutMapping("/core_j/{id}") @PutMapping("/sales/ap_display/core_j/{id}")
@RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR) @RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR)
public void putDisplayJDetail(@PathVariable("id") Long sadjId, @RequestBody SalesApRequest request){ public void putDisplayJDetail(@PathVariable("id") Long sadjId, @RequestBody SalesApRequest request){
// checkPermission(); // checkPermission();
...@@ -84,6 +82,22 @@ public class ApDisplayCoreController { ...@@ -84,6 +82,22 @@ public class ApDisplayCoreController {
apDisplayCoreService.putDisplayJDetail(request); apDisplayCoreService.putDisplayJDetail(request);
} }
/**
* 更新AP促销计划详情
* 大区总、战区经理、城市经理、TM,可以更新
*/
@PutMapping("/sales/ap_promotion/core/{id}")
@RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR)
public void putPromotionDetail(@PathVariable("id") Long sapId, @RequestBody SalesApRequest request) {
// checkPermission();
request.setSapId(sapId);
apDisplayCoreService.putPromotionDetail(request);
}
// @Autowired
// private IQinceMarketEmployeeService qinceMarketEmployeeService;
// private void checkPermission(){ // private void checkPermission(){
// // 是区域销售部的人员,查看人客关系 // // 是区域销售部的人员,查看人客关系
// LoginUser loginUser = SecurityUtils.getLoginUser(); // LoginUser loginUser = SecurityUtils.getLoginUser();
......
package com.sfa.operation.controller.sales.core;
import com.sfa.common.core.constant.RoleConstants;
import com.sfa.common.core.enums.ECode;
import com.sfa.common.core.exception.CheckedException;
import com.sfa.common.security.annotation.Logical;
import com.sfa.common.security.annotation.RequiresRoles;
import com.sfa.common.security.utils.SecurityUtils;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.service.qc.IQinceMarketEmployeeService;
import com.sfa.operation.service.sales.IApPromotionCoreService;
import com.sfa.system.api.domain.SysRole;
import com.sfa.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
/**
* @author : liqiulin
* @date : 2025-09-17 15
* @describe : 档期计划
*/
@RestController
@RequestMapping("/sales/ap_promotion/core")
public class ApPromotionCoreController {
@Autowired
private IApPromotionCoreService apPromotionCoreService;
@Autowired
private IQinceMarketEmployeeService qinceMarketEmployeeService;
/**
* 更新AP促销计划详情
* 大区总、战区经理、城市经理、TM,可以更新
*/
@PutMapping("/{id}")
@RequiresRoles(value = {RoleConstants.OPERATION_AP_MANAGER, RoleConstants.OPERATIONZQ_AP_MANAGER, RoleConstants.OPERATIONDQ_AP_MANAGER, RoleConstants.DISTRICT_AP_MANAGER}, logical = Logical.OR)
public void putDetail(@PathVariable("id") Long sapId, @RequestBody SalesApRequest request) {
// checkPermission();
request.setSapId(sapId);
apPromotionCoreService.updateDetail(request);
}
// private void checkPermission(){
// // 是区域销售部的人员,查看人客关系
// LoginUser loginUser = SecurityUtils.getLoginUser();
// // 只有销售(促销AP管理:cxapgl)、大区TM(大区TM促销AP管理:dqtmcxapgl)两种角色才可以修改
// List<SysRole> roles = loginUser.getSysUser().getRoles();
// Optional<SysRole> first = roles.stream().filter(role -> RoleConstants.DISTRICT_AP_MANAGER.equals(role.getRoleKey()) || RoleConstants.OPERATION_AP_MANAGER.equals(role.getRoleKey())).findFirst();
// if (!first.isPresent()) {
// throw new CheckedException(ECode.ZZ_PRODUCT_QUALITY_AP_ERROR);
// }
//
//// String empNo = loginUser.getUsername();
//// List<String> dealerCodes = qinceMarketEmployeeService.checkPermission(empNo);
//// if (dealerCodes.isEmpty()){
//// throw new CheckedException(ECode.QC_MARKET_EMP_ERROR);
//// }
// }
}
...@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.GetMapping; ...@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
...@@ -31,9 +32,7 @@ import java.util.Optional; ...@@ -31,9 +32,7 @@ import java.util.Optional;
* 三米两秒 * 三米两秒
* 六小金刚 * 六小金刚
*/ */
@RequiresPermissions("promotion:display_schedule:list")
@RestController @RestController
@RequestMapping("/sales/ap_display/query")
public class ApDisplayQueryController { public class ApDisplayQueryController {
@Autowired @Autowired
private IApDisplayQueryService apDisplayQueryService; private IApDisplayQueryService apDisplayQueryService;
...@@ -45,7 +44,7 @@ public class ApDisplayQueryController { ...@@ -45,7 +44,7 @@ public class ApDisplayQueryController {
/** /**
* 常规陈列 * 常规陈列
*/ */
@GetMapping("/page") @GetMapping("/sales/ap_display/query/page")
public PageInfo page(SalesApRequest salesApRequest){ public PageInfo page(SalesApRequest salesApRequest){
checkPermission(salesApRequest); checkPermission(salesApRequest);
return apDisplayQueryService.page(salesApRequest); return apDisplayQueryService.page(salesApRequest);
...@@ -54,7 +53,7 @@ public class ApDisplayQueryController { ...@@ -54,7 +53,7 @@ public class ApDisplayQueryController {
/** /**
* 档期陈列 * 档期陈列
*/ */
@GetMapping("/pro_page") @GetMapping("/sales/ap_display/query/pro_page")
public PageInfo proPage(SalesApRequest salesApRequest){ public PageInfo proPage(SalesApRequest salesApRequest){
checkPermission(salesApRequest); checkPermission(salesApRequest);
return apDisplayQueryService.proPage(salesApRequest); return apDisplayQueryService.proPage(salesApRequest);
...@@ -63,7 +62,7 @@ public class ApDisplayQueryController { ...@@ -63,7 +62,7 @@ public class ApDisplayQueryController {
/** /**
* 零食陈列 * 零食陈列
*/ */
@GetMapping("/snack_page") @GetMapping("/sales/ap_display/query/snack_page")
public PageInfo snackPage(SalesApRequest salesApRequest){ public PageInfo snackPage(SalesApRequest salesApRequest){
checkPermission(salesApRequest); checkPermission(salesApRequest);
return apDisplayQueryService.snackPage(salesApRequest); return apDisplayQueryService.snackPage(salesApRequest);
...@@ -72,7 +71,7 @@ public class ApDisplayQueryController { ...@@ -72,7 +71,7 @@ public class ApDisplayQueryController {
/** /**
* 三米两秒 * 三米两秒
*/ */
@GetMapping("/sl_page") @GetMapping("/sales/ap_display/query/sl_page")
public PageInfo slPage(SalesApRequest salesApRequest){ public PageInfo slPage(SalesApRequest salesApRequest){
checkPermission(salesApRequest); checkPermission(salesApRequest);
return apDisplayQueryService.slPage(salesApRequest); return apDisplayQueryService.slPage(salesApRequest);
...@@ -81,12 +80,21 @@ public class ApDisplayQueryController { ...@@ -81,12 +80,21 @@ public class ApDisplayQueryController {
/** /**
* 六小金刚 * 六小金刚
*/ */
@GetMapping("/jg_page") @GetMapping("/sales/ap_display/query/jg_page")
public PageInfo jgPage(SalesApRequest salesApRequest){ public PageInfo jgPage(SalesApRequest salesApRequest){
checkPermission(salesApRequest); checkPermission(salesApRequest);
return apDisplayQueryService.jgPage(salesApRequest); return apDisplayQueryService.jgPage(salesApRequest);
} }
/**
* 档期计划
*/
@GetMapping("/sales/ap_promotion/query/page")
public PageInfo promotionPage(SalesApRequest salesApRequest){
checkPermission(salesApRequest);
return apDisplayQueryService.promotionPage(salesApRequest);
}
/** /**
* 判断登录人权限 * 判断登录人权限
* 判断是否存在人客关系,存在:根据负责经销商查询数据;不存在:判断是否是销售部人员。是:根据部门查询;不是:返回全部数据 * 判断是否存在人客关系,存在:根据负责经销商查询数据;不存在:判断是否是销售部人员。是:根据部门查询;不是:返回全部数据
...@@ -106,8 +114,11 @@ public class ApDisplayQueryController { ...@@ -106,8 +114,11 @@ public class ApDisplayQueryController {
String empNo = loginUser.getUsername(); String empNo = loginUser.getUsername();
Optional<SysRole> first = roles.stream().filter(role -> RoleConstants.DISTRICT_AP_MANAGER.equals(role.getRoleKey())).findFirst(); Optional<SysRole> first = roles.stream().filter(role -> RoleConstants.DISTRICT_AP_MANAGER.equals(role.getRoleKey())).findFirst();
if (first.isPresent()) { if (first.isPresent()) {
String deptName = loginUser.getSysUser().getDept().getDeptName(); ArrayList<String> deptNames = new ArrayList<>();
salesApRequest.setDeptNames("000889".equals(empNo) ? Arrays.asList(deptName,"北京特区") : Arrays.asList(deptName)); deptNames.add(loginUser.getSysUser().getDept().getDeptName());
if ("000889".equals(empNo)){
deptNames.add("北京特区");
}
return; return;
} }
// 不是大区TM,判断是否是销售人员(人客关系) // 不是大区TM,判断是否是销售人员(人客关系)
......
package com.sfa.operation.controller.sales.query;
import com.sfa.common.core.constant.RoleConstants;
import com.sfa.common.core.enums.ECode;
import com.sfa.common.core.exception.CheckedException;
import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.common.security.utils.SecurityUtils;
import com.sfa.operation.config.ConstantValue;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.service.qc.IQinceMarketEmployeeService;
import com.sfa.operation.service.sales.IApPromotionQueryService;
import com.sfa.system.api.domain.SysRole;
import com.sfa.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/**
* @author : liqiulin
* @date : 2025-09-17 15
* @describe : 档期计划
*/
@RestController
@RequestMapping("/sales/ap_promotion/query")
public class ApPromotionQueryController {
@Autowired
private IApPromotionQueryService apPromotionQueryService;
@Autowired
private IQinceMarketEmployeeService qinceMarketEmployeeService;
@Autowired
private ConstantValue constantValue;
@GetMapping("/page")
public PageInfo page(SalesApRequest salesApRequest){
checkPermission(salesApRequest);
return apPromotionQueryService.page(salesApRequest);
}
/**
* 判断登录人权限
* 判断是否存在人客关系,存在:根据负责经销商查询数据;不存在:判断是否是销售部人员。是:根据部门查询;不是:返回全部数据
*/
private void checkPermission(SalesApRequest salesApRequest) {
LoginUser loginUser = SecurityUtils.getLoginUser();
String ancestors = loginUser.getSysUser().getDept().getAncestors();
List<SysRole> roles = loginUser.getSysUser().getRoles();
// 不是区域销售部的人员,可以查看所有
if (!ancestors.contains(constantValue.deptYX) && roles.stream().filter(role -> RoleConstants.OPERATION_CENTER_AP_MANAGER.equals(role.getRoleKey())).findFirst().isPresent()) {
return;
}
// 是区域销售部的人员:1、销售查看人客关系;2、大区TM查看当前部门下所有数据
// 判断是否是大区TM
String empNo = loginUser.getUsername();
Optional<SysRole> first = roles.stream().filter(role -> RoleConstants.DISTRICT_AP_MANAGER.equals(role.getRoleKey())).findFirst();
if (first.isPresent()) {
String deptName = loginUser.getSysUser().getDept().getDeptName();
salesApRequest.setDeptNames("000889".equals(empNo) ? Arrays.asList(deptName,"北京特区") : Arrays.asList(deptName));
return;
}
// 不是大区TM,判断是否是销售人员(人客关系)
List<String> dealerCodes = qinceMarketEmployeeService.checkPermission(empNo);
if (dealerCodes.isEmpty()) {
throw new CheckedException(ECode.QC_MARKET_EMP_ERROR);
}
// salesApRequest.setNickName(loginUser.getNickName());
salesApRequest.setDealerCodes(dealerCodes);
}
}
...@@ -88,6 +88,13 @@ public class SalesApDisplayDaoImpl implements ISalesApDisplayDao { ...@@ -88,6 +88,13 @@ public class SalesApDisplayDaoImpl implements ISalesApDisplayDao {
.in(SalesApDisplay::getDistrictName, salesApWq.getDeptNames()) .in(SalesApDisplay::getDistrictName, salesApWq.getDeptNames())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getDeptName())){
qw.and(
wrapper -> wrapper.like(SalesApDisplay::getRegionName, salesApWq.getDeptName())
.or()
.like(SalesApDisplay::getDistrictName, salesApWq.getDeptName())
);
}
if (StringUtils.isNotBlank(salesApWq.getNickName())){ if (StringUtils.isNotBlank(salesApWq.getNickName())){
qw.and( qw.and(
wrapper -> wrapper.eq(SalesApDisplay::getRegionManager, salesApWq.getNickName()) wrapper -> wrapper.eq(SalesApDisplay::getRegionManager, salesApWq.getNickName())
......
...@@ -71,6 +71,13 @@ public class SalesApDisplayJDaoImpl implements ISalesApDisplayJDao { ...@@ -71,6 +71,13 @@ public class SalesApDisplayJDaoImpl implements ISalesApDisplayJDao {
.in(SalesApDisplayJ::getDistrictName, salesApWq.getDeptNames()) .in(SalesApDisplayJ::getDistrictName, salesApWq.getDeptNames())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getDeptName())) {
qw.and(
wrapper -> wrapper.like(SalesApDisplayJ::getRegionName, salesApWq.getDeptName())
.or()
.like(SalesApDisplayJ::getDistrictName, salesApWq.getDeptName())
);
}
if (StringUtils.isNotBlank(salesApWq.getNickName())){ if (StringUtils.isNotBlank(salesApWq.getNickName())){
qw.and( qw.and(
wrapper -> wrapper.eq(SalesApDisplayJ::getRegionManager, salesApWq.getNickName()) wrapper -> wrapper.eq(SalesApDisplayJ::getRegionManager, salesApWq.getNickName())
......
...@@ -70,6 +70,13 @@ public class SalesApDisplaySDaoImpl implements ISalesApDisplaySDao { ...@@ -70,6 +70,13 @@ public class SalesApDisplaySDaoImpl implements ISalesApDisplaySDao {
.in(SalesApDisplayS::getDistrictName, salesApWq.getDeptNames()) .in(SalesApDisplayS::getDistrictName, salesApWq.getDeptNames())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getDeptName())) {
qw.and(
wrapper -> wrapper.like(SalesApDisplayS::getRegionName, salesApWq.getDeptName())
.or()
.like(SalesApDisplayS::getDistrictName, salesApWq.getDeptName())
);
}
if (StringUtils.isNotBlank(salesApWq.getNickName())){ if (StringUtils.isNotBlank(salesApWq.getNickName())){
qw.and( qw.and(
wrapper -> wrapper.eq(SalesApDisplayS::getRegionManager, salesApWq.getNickName()) wrapper -> wrapper.eq(SalesApDisplayS::getRegionManager, salesApWq.getNickName())
......
...@@ -32,6 +32,7 @@ import java.util.Objects; ...@@ -32,6 +32,7 @@ import java.util.Objects;
public class SalesApPromotionDisplayDaoImpl implements ISalesApPromotionDisplayDao { public class SalesApPromotionDisplayDaoImpl implements ISalesApPromotionDisplayDao {
@Autowired @Autowired
private SalesApPromotionDisplayMapper salesApPromotionDisplayMapper; private SalesApPromotionDisplayMapper salesApPromotionDisplayMapper;
@Override @Override
public PageInfo page(SalesApWq salesApWq) { public PageInfo page(SalesApWq salesApWq) {
LambdaQueryWrapper<SalesApPromotionDisplay> qw = buildWq(salesApWq); LambdaQueryWrapper<SalesApPromotionDisplay> qw = buildWq(salesApWq);
...@@ -42,30 +43,37 @@ public class SalesApPromotionDisplayDaoImpl implements ISalesApPromotionDisplayD ...@@ -42,30 +43,37 @@ public class SalesApPromotionDisplayDaoImpl implements ISalesApPromotionDisplayD
@Override @Override
public void updateDetail(SalesApPromotionDisplayDto pdDto) { public void updateDetail(SalesApPromotionDisplayDto pdDto) {
SalesApPromotionDisplay salesApPromotionDisplay = salesApPromotionDisplayMapper.selectById(pdDto.getSapdId()); SalesApPromotionDisplay salesApPromotionDisplay = salesApPromotionDisplayMapper.selectById(pdDto.getSapdId());
if (!DateUtils.isSameYearMonth(salesApPromotionDisplay.getSalesMonth(),new Date())){ if (!DateUtils.isSameYearMonth(salesApPromotionDisplay.getSalesMonth(), new Date())) {
throw new CheckedException(ECode.SALES_AP_UPDATE_ERROR); throw new CheckedException(ECode.SALES_AP_UPDATE_ERROR);
} }
SalesApPromotionDisplay pd = new SalesApPromotionDisplay(); SalesApPromotionDisplay pd = new SalesApPromotionDisplay();
BeanUtils.copyProperties(pdDto,pd); BeanUtils.copyProperties(pdDto, pd);
salesApPromotionDisplayMapper.updateById(pd); salesApPromotionDisplayMapper.updateById(pd);
} }
private LambdaQueryWrapper<SalesApPromotionDisplay> buildWq(SalesApWq salesApWq) { private LambdaQueryWrapper<SalesApPromotionDisplay> buildWq(SalesApWq salesApWq) {
LambdaQueryWrapper<SalesApPromotionDisplay> qw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SalesApPromotionDisplay> qw = new LambdaQueryWrapper<>();
if (Objects.nonNull(salesApWq.getSalesMonth())){ if (Objects.nonNull(salesApWq.getSalesMonth())) {
qw.eq(SalesApPromotionDisplay::getSalesMonth, salesApWq.getSalesMonth()); qw.eq(SalesApPromotionDisplay::getSalesMonth, salesApWq.getSalesMonth());
} }
if (!CollectionUtils.isEmpty(salesApWq.getDealerCodes())) { if (!CollectionUtils.isEmpty(salesApWq.getDealerCodes())) {
qw.in(SalesApPromotionDisplay::getDealerCode, salesApWq.getDealerCodes()); qw.in(SalesApPromotionDisplay::getDealerCode, salesApWq.getDealerCodes());
} }
if (!CollectionUtils.isEmpty(salesApWq.getDeptNames())){ if (!CollectionUtils.isEmpty(salesApWq.getDeptNames())) {
qw.and( qw.and(
wrapper -> wrapper.in(SalesApPromotionDisplay::getRegionName, salesApWq.getDeptNames()) wrapper -> wrapper.in(SalesApPromotionDisplay::getRegionName, salesApWq.getDeptNames())
.or() .or()
.in(SalesApPromotionDisplay::getDistrictName, salesApWq.getDeptNames()) .in(SalesApPromotionDisplay::getDistrictName, salesApWq.getDeptNames())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getNickName())){ if (StringUtils.isNotBlank(salesApWq.getDeptName())) {
qw.and(
wrapper -> wrapper.like(SalesApPromotionDisplay::getRegionName, salesApWq.getDeptName())
.or()
.like(SalesApPromotionDisplay::getDistrictName, salesApWq.getDeptName())
);
}
if (StringUtils.isNotBlank(salesApWq.getNickName())) {
qw.and( qw.and(
wrapper -> wrapper.eq(SalesApPromotionDisplay::getRegionManager, salesApWq.getNickName()) wrapper -> wrapper.eq(SalesApPromotionDisplay::getRegionManager, salesApWq.getNickName())
.or() .or()
...@@ -74,24 +82,24 @@ public class SalesApPromotionDisplayDaoImpl implements ISalesApPromotionDisplayD ...@@ -74,24 +82,24 @@ public class SalesApPromotionDisplayDaoImpl implements ISalesApPromotionDisplayD
.eq(SalesApPromotionDisplay::getCityManager, salesApWq.getNickName()) .eq(SalesApPromotionDisplay::getCityManager, salesApWq.getNickName())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getDealerCN())){ if (StringUtils.isNotBlank(salesApWq.getDealerCN())) {
qw.and( qw.and(
wrapper -> wrapper.like(SalesApPromotionDisplay::getDealerName, salesApWq.getDealerCN()) wrapper -> wrapper.like(SalesApPromotionDisplay::getDealerName, salesApWq.getDealerCN())
.or() .or()
.like(SalesApPromotionDisplay::getDealerCode, salesApWq.getDealerCN()) .like(SalesApPromotionDisplay::getDealerCode, salesApWq.getDealerCN())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getStoreCN())){ if (StringUtils.isNotBlank(salesApWq.getStoreCN())) {
qw.and( qw.and(
wrapper -> wrapper.like(SalesApPromotionDisplay::getStoreName, salesApWq.getStoreCN()) wrapper -> wrapper.like(SalesApPromotionDisplay::getStoreName, salesApWq.getStoreCN())
.or() .or()
.like(SalesApPromotionDisplay::getStoreCode, salesApWq.getStoreCN()) .like(SalesApPromotionDisplay::getStoreCode, salesApWq.getStoreCN())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getLineNameLike())){ if (StringUtils.isNotBlank(salesApWq.getLineNameLike())) {
qw.like(SalesApPromotionDisplay::getLineName, salesApWq.getLineNameLike()); qw.like(SalesApPromotionDisplay::getLineName, salesApWq.getLineNameLike());
} }
if (StringUtils.isNotBlank(salesApWq.getRqStatus())){ if (StringUtils.isNotBlank(salesApWq.getRqStatus())) {
qw.and( qw.and(
wrapper -> wrapper.eq(SalesApPromotionDisplay::getActualEndCapExecuted, salesApWq.getRqStatus()) wrapper -> wrapper.eq(SalesApPromotionDisplay::getActualEndCapExecuted, salesApWq.getRqStatus())
.or() .or()
......
...@@ -10,7 +10,6 @@ import com.sfa.common.core.utils.StringUtils; ...@@ -10,7 +10,6 @@ import com.sfa.common.core.utils.StringUtils;
import com.sfa.common.core.web.domain.PageInfo; import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.common.core.web.page.TableSupport; import com.sfa.common.core.web.page.TableSupport;
import com.sfa.operation.domain.sales.dao.ISalesApPromotionDao; import com.sfa.operation.domain.sales.dao.ISalesApPromotionDao;
import com.sfa.operation.domain.sales.entity.SalesApDisplay;
import com.sfa.operation.domain.sales.entity.SalesApPromotion; import com.sfa.operation.domain.sales.entity.SalesApPromotion;
import com.sfa.operation.domain.sales.mapper.SalesApPromotionMapper; import com.sfa.operation.domain.sales.mapper.SalesApPromotionMapper;
import com.sfa.operation.domain.sales.wq.SalesApWq; import com.sfa.operation.domain.sales.wq.SalesApWq;
...@@ -20,8 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -20,8 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Objects; import java.util.Objects;
...@@ -93,6 +90,13 @@ public class SalesApPromotionImplDao implements ISalesApPromotionDao { ...@@ -93,6 +90,13 @@ public class SalesApPromotionImplDao implements ISalesApPromotionDao {
.in(SalesApPromotion::getDistrictName, salesApWq.getDeptNames()) .in(SalesApPromotion::getDistrictName, salesApWq.getDeptNames())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getDeptName())) {
qw.and(
wrapper -> wrapper.like(SalesApPromotion::getRegionName, salesApWq.getDeptName())
.or()
.like(SalesApPromotion::getDistrictName, salesApWq.getDeptName())
);
}
if (StringUtils.isNotBlank(salesApWq.getNickName())){ if (StringUtils.isNotBlank(salesApWq.getNickName())){
qw.and( qw.and(
wrapper -> wrapper.eq(SalesApPromotion::getRegionManager, salesApWq.getNickName()) wrapper -> wrapper.eq(SalesApPromotion::getRegionManager, salesApWq.getNickName())
......
...@@ -68,6 +68,13 @@ public class SalesApSnacksDisplayDaoImpl implements ISalesApSnacksDisplayDao { ...@@ -68,6 +68,13 @@ public class SalesApSnacksDisplayDaoImpl implements ISalesApSnacksDisplayDao {
.in(SalesApSnacksDisplay::getDistrictName, salesApWq.getDeptNames()) .in(SalesApSnacksDisplay::getDistrictName, salesApWq.getDeptNames())
); );
} }
if (StringUtils.isNotBlank(salesApWq.getDeptName())) {
qw.and(
wrapper -> wrapper.like(SalesApSnacksDisplay::getRegionName, salesApWq.getDeptName())
.or()
.like(SalesApSnacksDisplay::getDistrictName, salesApWq.getDeptName())
);
}
if (StringUtils.isNotBlank(salesApWq.getNickName())){ if (StringUtils.isNotBlank(salesApWq.getNickName())){
qw.and( qw.and(
wrapper -> wrapper.eq(SalesApSnacksDisplay::getRegionManager, salesApWq.getNickName()) wrapper -> wrapper.eq(SalesApSnacksDisplay::getRegionManager, salesApWq.getNickName())
......
...@@ -16,9 +16,13 @@ public class SalesApWq { ...@@ -16,9 +16,13 @@ public class SalesApWq {
private Date salesMonth; private Date salesMonth;
private String cityManager; private String cityManager;
/** /**
* 大区/战区 * 前端搜索条件:大区/战区
*/ */
private String deptName; private String deptName;
/**
* 根据登录人,默认重置大区/战区信息
* 与deptName,不冲突
*/
private List<String> deptNames; private List<String> deptNames;
private String nickName; private String nickName;
private List<String> dealerCodes; private List<String> dealerCodes;
......
...@@ -17,4 +17,6 @@ public interface IApDisplayCoreService { ...@@ -17,4 +17,6 @@ public interface IApDisplayCoreService {
void putDisplaySDetail(SalesApRequest request); void putDisplaySDetail(SalesApRequest request);
void putDisplayJDetail(SalesApRequest request); void putDisplayJDetail(SalesApRequest request);
void putPromotionDetail(SalesApRequest request);
} }
...@@ -21,6 +21,8 @@ public interface IApDisplayQueryService { ...@@ -21,6 +21,8 @@ public interface IApDisplayQueryService {
PageInfo jgPage(SalesApRequest salesApRequest); PageInfo jgPage(SalesApRequest salesApRequest);
PageInfo promotionPage(SalesApRequest salesApRequest);
Object queryStoreAPReport(SalesApRequest request); Object queryStoreAPReport(SalesApRequest request);
Object queryDeptAPReport(SalesApRequest request); Object queryDeptAPReport(SalesApRequest request);
......
package com.sfa.operation.service.sales;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
/**
* @author : liqiulin
* @date : 2025-09-17 15
* @describe :
*/
public interface IApPromotionCoreService {
void updateDetail(SalesApRequest request);
}
package com.sfa.operation.service.sales;
import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
/**
* @author : liqiulin
* @date : 2025-09-17 15
* @describe :
*/
public interface IApPromotionQueryService {
PageInfo page(SalesApRequest salesApRequest);
}
package com.sfa.operation.service.sales.impl; package com.sfa.operation.service.sales.impl;
import cn.hutool.core.date.DatePattern;
import com.sfa.common.security.utils.SecurityUtils; import com.sfa.common.security.utils.SecurityUtils;
import com.sfa.operation.domain.sales.dao.*; import com.sfa.operation.domain.sales.dao.*;
import com.sfa.operation.pojo.sales.request.SalesApRequest; import com.sfa.operation.pojo.sales.request.SalesApRequest;
...@@ -9,6 +10,10 @@ import org.springframework.beans.BeanUtils; ...@@ -9,6 +10,10 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.Date;
import java.util.Objects;
/** /**
* @author : liqiulin * @author : liqiulin
* @date : 2025-09-16 16 * @date : 2025-09-16 16
...@@ -26,6 +31,8 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService { ...@@ -26,6 +31,8 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService {
private ISalesApDisplaySDao salesApDisplaySDao; private ISalesApDisplaySDao salesApDisplaySDao;
@Autowired @Autowired
private ISalesApDisplayJDao salesApDisplayJDao; private ISalesApDisplayJDao salesApDisplayJDao;
@Autowired
private ISalesApPromotionDao salesApPromotionDao;
@Override @Override
public void updateDetail(SalesApRequest request) { public void updateDetail(SalesApRequest request) {
SalesApDisplayDto salesApDisplayDto = new SalesApDisplayDto(); SalesApDisplayDto salesApDisplayDto = new SalesApDisplayDto();
...@@ -70,4 +77,37 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService { ...@@ -70,4 +77,37 @@ public class ApDisplayCoreServiceImpl implements IApDisplayCoreService {
djDto.setUpdateBy(SecurityUtils.getNickName()); djDto.setUpdateBy(SecurityUtils.getNickName());
salesApDisplayJDao.updateDetail(djDto); salesApDisplayJDao.updateDetail(djDto);
} }
@Override
public void putPromotionDetail(SalesApRequest request) {
// 修改DB 日期值为null
try {
SalesApPromotionDto dto = new SalesApPromotionDto();
SalesApRequest.Promotion promotion = request.getPromotion();
BeanUtils.copyProperties(promotion, dto);
dto.setSapId(request.getSapId());
Date parse = DatePattern.NORM_DATE_FORMAT.parse("2000-01-01");
if (Objects.isNull(promotion.getActualPromotionStartDate())) {
dto.setIsActualPromotionStartDate(true);
} else if (promotion.getActualPromotionStartDate().compareTo(parse) == 0) {
dto.setIsActualPromotionStartDate(false);
}else {
dto.setIsActualPromotionStartDate(true);
}
if (Objects.isNull(promotion.getActualPromotionEndDate())) {
// DB 日期值无需修改
dto.setIsActualPromotionEndDate(true);
} else if (promotion.getActualPromotionEndDate().compareTo(parse) == 0) {
// DB 日期值无需修改
dto.setIsActualPromotionEndDate(false);
}else {
dto.setIsActualPromotionEndDate(true);
}
dto.setUpdateBy(SecurityUtils.getNickName());
salesApPromotionDao.updateById(dto);
} catch (ParseException e) {
e.printStackTrace();
}
}
} }
...@@ -2,6 +2,7 @@ package com.sfa.operation.service.sales.impl; ...@@ -2,6 +2,7 @@ package com.sfa.operation.service.sales.impl;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.sfa.common.core.utils.StringUtils;
import com.sfa.common.core.utils.bean.BeanUtils; import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.common.core.web.domain.PageInfo; import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.operation.domain.feishu.dao.IQinceMarketEmployeeDao; import com.sfa.operation.domain.feishu.dao.IQinceMarketEmployeeDao;
...@@ -11,8 +12,11 @@ import com.sfa.operation.pojo.sales.request.SalesApRequest; ...@@ -11,8 +12,11 @@ import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.service.sales.IApDisplayQueryService; import com.sfa.operation.service.sales.IApDisplayQueryService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.awt.dnd.Autoscroll; import java.awt.dnd.Autoscroll;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
...@@ -32,7 +36,8 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService { ...@@ -32,7 +36,8 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService {
private ISalesApDisplaySDao salesApDisplaySDao; private ISalesApDisplaySDao salesApDisplaySDao;
@Autowired @Autowired
private ISalesApDisplayJDao salesApDisplayJDao; private ISalesApDisplayJDao salesApDisplayJDao;
@Autowired
private ISalesApPromotionDao salesApPromotionDao;
@Override @Override
public PageInfo page(SalesApRequest salesApRequest) { public PageInfo page(SalesApRequest salesApRequest) {
...@@ -59,6 +64,11 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService { ...@@ -59,6 +64,11 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService {
return salesApDisplayJDao.page(build(salesApRequest)); return salesApDisplayJDao.page(build(salesApRequest));
} }
@Override
public PageInfo promotionPage(SalesApRequest salesApRequest) {
return salesApPromotionDao.page(build(salesApRequest));
}
@Override @Override
public Object queryStoreAPReport(SalesApRequest salesApRequest) { public Object queryStoreAPReport(SalesApRequest salesApRequest) {
return salesApDisplayDao.queryStoreAPReport(build(salesApRequest)); return salesApDisplayDao.queryStoreAPReport(build(salesApRequest));
...@@ -73,6 +83,12 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService { ...@@ -73,6 +83,12 @@ public class ApDisplayQueryServiceImpl implements IApDisplayQueryService {
SalesApWq salesApWq = new SalesApWq(); SalesApWq salesApWq = new SalesApWq();
BeanUtils.copyProperties(salesApRequest,salesApWq); BeanUtils.copyProperties(salesApRequest,salesApWq);
salesApWq.setSalesMonth(salesApRequest.getSalesMonth() != null ? DateUtil.parse(salesApRequest.getSalesMonth() + "-01", DatePattern.NORM_DATE_PATTERN) : null); salesApWq.setSalesMonth(salesApRequest.getSalesMonth() != null ? DateUtil.parse(salesApRequest.getSalesMonth() + "-01", DatePattern.NORM_DATE_PATTERN) : null);
// if (StringUtils.isNotBlank(salesApRequest.getDeptName())){
// List<String> deptNames = CollectionUtils.isEmpty(salesApWq.getDeptNames()) ? new ArrayList<>() : salesApWq.getDeptNames();
// deptNames.add(salesApRequest.getDeptName());
// salesApWq.setDeptNames(deptNames);
// }
return salesApWq; return salesApWq;
} }
} }
package com.sfa.operation.service.sales.impl;
import cn.hutool.core.date.DatePattern;
import com.sfa.common.security.utils.SecurityUtils;
import com.sfa.operation.domain.sales.dao.ISalesApPromotionDao;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.pojo.sales.response.SalesApPromotionDto;
import com.sfa.operation.service.sales.IApPromotionCoreService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.Date;
import java.util.Objects;
/**
* @author : liqiulin
* @date : 2025-09-17 15
* @describe :
*/
@Service
public class ApPromotionCoreServiceImpl implements IApPromotionCoreService {
@Autowired
private ISalesApPromotionDao salesApPromotionDao;
@Override
public void updateDetail(SalesApRequest request) {
// 修改DB 日期值为null
try {
SalesApPromotionDto dto = new SalesApPromotionDto();
SalesApRequest.Promotion promotion = request.getPromotion();
BeanUtils.copyProperties(promotion, dto);
dto.setSapId(request.getSapId());
Date parse = DatePattern.NORM_DATE_FORMAT.parse("2000-01-01");
if (Objects.isNull(promotion.getActualPromotionStartDate())) {
dto.setIsActualPromotionStartDate(true);
} else if (promotion.getActualPromotionStartDate().compareTo(parse) == 0) {
dto.setIsActualPromotionStartDate(false);
}else {
dto.setIsActualPromotionStartDate(true);
}
if (Objects.isNull(promotion.getActualPromotionEndDate())) {
// DB 日期值无需修改
dto.setIsActualPromotionEndDate(true);
} else if (promotion.getActualPromotionEndDate().compareTo(parse) == 0) {
// DB 日期值无需修改
dto.setIsActualPromotionEndDate(false);
}else {
dto.setIsActualPromotionEndDate(true);
}
dto.setUpdateBy(SecurityUtils.getNickName());
salesApPromotionDao.updateById(dto);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
package com.sfa.operation.service.sales.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.common.core.web.domain.PageInfo;
import com.sfa.operation.domain.sales.dao.ISalesApPromotionDao;
import com.sfa.operation.domain.sales.wq.SalesApWq;
import com.sfa.operation.pojo.sales.request.SalesApRequest;
import com.sfa.operation.service.sales.IApPromotionQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author : liqiulin
* @date : 2025-09-17 15
* @describe :
*/
@Service
public class ApPromotionQueryServiceImpl implements IApPromotionQueryService {
@Autowired
private ISalesApPromotionDao salesApPromotionDao;
@Override
public PageInfo page(SalesApRequest salesApRequest) {
SalesApWq salesApWq = new SalesApWq();
BeanUtils.copyProperties(salesApRequest,salesApWq);
salesApWq.setSalesMonth(salesApRequest.getSalesMonth() != null ? DateUtil.parse(salesApRequest.getSalesMonth() + "-01", DatePattern.NORM_DATE_PATTERN) : null);
return salesApPromotionDao.page(salesApWq);
}
}
...@@ -80,6 +80,7 @@ ...@@ -80,6 +80,7 @@
</resultMap> </resultMap>
<sql id = "commonQueryConditions"> <sql id = "commonQueryConditions">
and city_manager is not null
<if test="salesMonth != null"> <if test="salesMonth != null">
and sales_month = #{salesMonth} and sales_month = #{salesMonth}
</if> </if>
...@@ -303,7 +304,7 @@ ...@@ -303,7 +304,7 @@
</where> </where>
group by region_name, district_name,city_manager) sp group by region_name, district_name,city_manager) sp
on ar.region_name = sp.region_name and ar.district_name = sp.district_name and on ar.region_name = sp.region_name and ar.district_name = sp.district_name and
ar.city_manager = sp.city_manager ar.city_manager = sp.city_manager order by ar.region_name,ar.district_name
</select> </select>
...@@ -512,7 +513,7 @@ ...@@ -512,7 +513,7 @@
<include refid="deptZQQuery"/> <include refid="deptZQQuery"/>
</where> </where>
group by region_name, district_name) sp group by region_name, district_name) sp
on ar.region_name = sp.region_name and ar.district_name = sp.district_name on ar.region_name = sp.region_name and ar.district_name = sp.district_name order by ar.region_name,ar.district_name
</select> </select>
...@@ -709,7 +710,6 @@ ...@@ -709,7 +710,6 @@
<include refid="deptDQQuery"/> <include refid="deptDQQuery"/>
</where> </where>
group by region_name) sp group by region_name) sp
on ar.region_name = sp.region_name on ar.region_name = sp.region_name order by ar.region_name
</select> </select>
</mapper> </mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论