feat : tempSkuBuilder

pull/8040/head
Gauthier LO 2025-02-06 15:49:12 +01:00
parent da932802d7
commit 3030a527c2
22 changed files with 551 additions and 61 deletions

View File

@ -40,6 +40,8 @@ import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@ -56,6 +58,8 @@ import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDict
@RequestMapping("/sku")
@Slf4j
public class SkuController {
@Autowired
private IShopService shopService;
@Autowired
private ISkuService skuService;
@Autowired
@ -447,9 +451,88 @@ public class SkuController {
@PostMapping("/createMabangSku")
public Result<?> createMabangSku(@RequestBody List<SkuOrderPage> skuList) {
skuList.forEach(sku -> sku.setStatus(3));
log.info("Request to create {} new skus in Mabang", skuList.size());
skuList.forEach(sku -> {
if(sku.getId() != null && !sku.getId().isEmpty()) {
log.info("Request to pair sku [{}] with old sku [{}]", sku.getErpCode(), sku.getId());
}
if(sku.getShippingDiscount() == null) {
sku.setShippingDiscount(BigDecimal.ZERO);
} else {
BigDecimal oldValue = sku.getShippingDiscount().divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
sku.setShippingDiscount(BigDecimal.ONE.subtract(oldValue));
}
sku.setStatus(3);
});
return Result.OK(skuListMabangService.publishSkuToMabang(skuList));
}
@RequestMapping(value = "/exportNewMabangSkusXls")
public ModelAndView exportXls(@RequestParam Map<String, String> params) {
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List<NewSkuPage> skuList = parseSkuList(params);
log.info("Request to create {} new skus in Mabang", skuList.size());
skuList.forEach(sku -> {
if(sku.getShippingDiscount() == null) {
sku.setShippingDiscount(BigDecimal.ONE);
} else {
BigDecimal oldValue = sku.getShippingDiscount().divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
sku.setShippingDiscount(BigDecimal.ONE.subtract(oldValue));
}
sku.setStatus(3);
});
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
mv.addObject(NormalExcelConstants.FILE_NAME, "新增库存SKU表");
mv.addObject(NormalExcelConstants.CLASS, NewSkuPage.class);
mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("新增库存SKU表数据", "导出人:" + sysUser.getRealname(), "新增库存SKU表"));
mv.addObject(NormalExcelConstants.DATA_LIST, skuList);
return mv;
}
private List<NewSkuPage> parseSkuList(Map<String, String> params) {
// Group parameters by "selections[index]"
Map<Integer, Map<String, String>> grouped = new HashMap<>();
for (Map.Entry<String, String> entry : params.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (key.startsWith("selections[")) {
int indexStart = key.indexOf("[") + 1;
int indexEnd = key.indexOf("]");
int index = Integer.parseInt(key.substring(indexStart, indexEnd));
String field = key.substring(key.indexOf("][") + 2, key.length() - 1);
grouped.computeIfAbsent(index, k -> new HashMap<>()).put(field, value);
}
}
// Convert maps to SkuOrderPage objects
return grouped.values().stream()
.map(this::mapToSkuOrderPage)
.collect(Collectors.toList());
}
private NewSkuPage mapToSkuOrderPage(Map<String, String> map) {
NewSkuPage sku = new NewSkuPage();
sku.setMabangSku(map.get("id"));
sku.setZhName(map.get("zhName"));
sku.setEnName(map.get("enName"));
sku.setDeclareEname(map.get("declareEname"));
sku.setDeclareName(map.get("declareName"));
sku.setErpCode(map.get("erpCode"));
sku.setWeight(map.get("weight") != null ? Integer.parseInt(map.get("weight")) : null);
sku.setStatus(map.get("status") != null ? Integer.parseInt(map.get("status")) : 3);
sku.setSensitiveAttribute(map.get("sensitiveAttribute"));
sku.setIsGift(map.get("isGift") != null ? Integer.parseInt(map.get("isGift")) : 2);
sku.setSkuPrice(map.get("skuPrice") != null ? new BigDecimal(map.get("skuPrice")) : BigDecimal.ZERO);
sku.setDeclaredValue(map.get("declaredValue") != null ? new BigDecimal(map.get("declaredValue")) : null);
sku.setShippingDiscount(map.get("shippingDiscount") != null ? new BigDecimal(map.get("shippingDiscount")) : BigDecimal.ZERO);
sku.setServiceFee(map.get("serviceFee") != null ? new BigDecimal(map.get("serviceFee")) : BigDecimal.ZERO);
sku.setWarehouse(map.get("warehouse"));
sku.setSupplier(map.get("supplier"));
sku.setSupplierLink(map.get("supplierLink"));
sku.setImageSource(map.get("imageSource"));
return sku;
}
@PostMapping("syncSkus")
public Result<?> syncSkus(@RequestBody List<String> erpCodes) {
Map<Sku, String> newSkusNeedTreatmentMap;
@ -496,4 +579,34 @@ public class SkuController {
skuListMabangService.mabangSkuStockUpdate(erpCodes);
return Result.OK();
}
@GetMapping("/unpairedSkus")
public Result<?> unpairedSkus(@RequestParam(name = "shop") String shopCode,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "50") Integer pageSize,
@RequestParam(name = "column", defaultValue = "erp_code") String column,
@RequestParam(name = "order", defaultValue = "ASC") String order
) {
String parsedColumn = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, column.replace("_dictText", ""));
String parsedOrder = order.toUpperCase();
if(!parsedOrder.equals("ASC") && !parsedOrder.equals("DESC")) {
return Result.error("Error 400 Bad Request");
}
try {
specialFilterContentForDictSql(parsedColumn);
} catch (RuntimeException e) {
return Result.error("Error 400 Bad Request");
}
String shopId = shopService.getIdByCode(shopCode);
if (shopId == null) return Result.error(404, "Shop not found");
int total = skuListMabangService.countUnpairedSkus(shopId);
List<SkuOrderPage> unpairedSkus = skuListMabangService.unpairedSkus(shopId, pageNo, pageSize, parsedColumn, parsedOrder);
IPage<SkuOrderPage> page = new Page<>();
page.setRecords(unpairedSkus);
page.setCurrent(pageNo);
page.setSize(pageSize);
page.setTotal(total);
return Result.OK(page);
}
}

View File

@ -31,7 +31,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.system.base.controller.JeecgController;
import org.jeecg.modules.business.vo.Responses;
import org.jeecg.modules.business.vo.ResponsesWithMsg;
import org.jeecg.modules.business.vo.SkuWeightPage;
import org.jeecg.modules.business.vo.SkuWeightParam;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
@ -192,7 +192,7 @@ public class SkuWeightController extends JeecgController<SkuWeight, ISkuWeightSe
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
Responses responses = new Responses();
ResponsesWithMsg responses = new ResponsesWithMsg();
List<SkuWeight> skuWeights = new ArrayList<>();
Map<String, SkuWeight> skuWeightMappedByErpCode = new HashMap<>();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
@ -242,16 +242,16 @@ public class SkuWeightController extends JeecgController<SkuWeight, ISkuWeightSe
skuWeightMappedByErpCode.put(erpCode, skuWeight);
}
log.info("Import weights for skus: {}", skuWeightMappedByErpCode.keySet());
Responses mabangResponses = skuListMabangService.mabangSkuWeightUpdate(skuWeights);
ResponsesWithMsg mabangResponses = skuListMabangService.mabangSkuWeightUpdate(skuWeights);
List<SkuWeight> skuWeightSuccesses = new ArrayList<>();
mabangResponses.getSuccesses().forEach(skuErpCode -> {
String erpCode = skuErpCode.split(":")[0].trim();
skuWeightSuccesses.add(skuWeightMappedByErpCode.get(erpCode));
mabangResponses.getSuccesses().forEach((skuErpCode, messages) -> {
skuWeightSuccesses.add(skuWeightMappedByErpCode.get(skuErpCode));
});
skuWeightSuccesses.forEach(skuWeight -> skuMongoService.upsertSkuWeight(skuWeight));
skuWeightService.saveBatch(skuWeights);
responses.getSuccesses().addAll(mabangResponses.getSuccesses());
responses.getFailures().addAll(mabangResponses.getFailures());
mabangResponses.getSuccesses().forEach(responses::addSuccess);
mabangResponses.getFailures().forEach(responses::addFailure);
} catch (Exception e) {
e.printStackTrace();
String msg = e.getMessage();
@ -324,11 +324,10 @@ public class SkuWeightController extends JeecgController<SkuWeight, ISkuWeightSe
skuWeightsMap.put(sku.getErpCode(), skuWeight);
}
List<SkuWeight> skuWeights = new ArrayList<>(skuWeightsMap.values());
Responses responses = skuListMabangService.mabangSkuWeightUpdate(skuWeights);
ResponsesWithMsg responses = skuListMabangService.mabangSkuWeightUpdate(skuWeights);
List<SkuWeight> skuWeightSuccesses = new ArrayList<>();
responses.getSuccesses().forEach(skuErpCode -> {
String erpCode = skuErpCode.split(":")[0].trim();
skuWeightSuccesses.add(skuWeightsMap.get(erpCode));
responses.getSuccesses().forEach((skuErpCode, messages) -> {
skuWeightSuccesses.add(skuWeightsMap.get(skuErpCode));
});
skuWeightSuccesses.forEach(skuWeight -> skuMongoService.upsertSkuWeight(skuWeight));

View File

@ -40,6 +40,11 @@ public class SkuData {
private Integer status;
@JSONField(name="originalSku")
private String originalSku;
/**
* if multiple virtual skus, they need to be separated by ";"
*/
@JSONField(name="virtualSkus")
private String virtualSkus;
@JSONField(name="salePrice")
private BigDecimal salePrice;
@JSONField(name="declareValue")
@ -54,7 +59,10 @@ public class SkuData {
private BigDecimal purchasePrice;
/**默认供应商名称,接口参数传showProvider才返回*/
@JSONField(name="warehouse")
private String warehouse;
private Warehouse[] warehouse;
@JSONField(name="warehouseName")
private String warehouseName;
/**
* if stockPicture is empty, we use it
*/
@ -109,7 +117,7 @@ public class SkuData {
/**
* 1: 22
*/
@JSONField(name="is_flammable")
@JSONField(name="is_flammables")
private Integer isFlammable;
/**
* 1 22

View File

@ -31,7 +31,7 @@ public class SkuListRawStream implements NetworkDataStream<SkuListResponse> {
public SkuListResponse attempt() {
log.info("Begin the first request");
this.currentResponse = new SkuListRequest(toSend).send();
if (currentResponse.getData().isEmpty()) {
if (currentResponse.getData() == null || currentResponse.getData().isEmpty()) {
return null;
}
began = true;

View File

@ -48,7 +48,7 @@ public class SkuListRequestBody implements RequestBody {
putNonNull(json, "maxRows", maxRows);
putNonNull(json, "showVirtualSku", showVirtualSku);
putNonNull(json, "showProvider", showProvider);
putNonNull(json, "showWarehouse", showWarehouse);
putNonNull(json, "showWarehouse", String.valueOf(showWarehouse));
putNonNull(json, "showLabel", showLabel);
putNonNull(json, "showAttributes", showAttributes);
return json;

View File

@ -0,0 +1,43 @@
package org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
@Data
// 仓库信息,接口参数传showWarehouse才返回
public class Warehouse {
/**仓库编号*/
@JSONField(name = "warehouseId")
private long warehouseId;
/**仓位**/
@JSONField(name = "gridCode")
private String gridCode;
/**库存警戒天数*/
@JSONField(name = "stockWarningDays")
private int stockWarningDays;
/**商品预警天数*/
@JSONField(name="product_warning_days")
private int productWarningDays;
/**仓库名称*/
@JSONField(name = "warehouseName")
private String warehouseName;
/**仓库状态:1启用;2停用*/
@JSONField(name = "status")
private int status;
/**仓库成本价*/
@JSONField(name = "stockCost")
private String stockCost;
/**是否是默认仓库1是;2否*/
@JSONField(name = "isDefault")
private int isDefault;
/**警戒库存*/
@JSONField(name = "stockWarningQuantity")
private int stockWarningQuantity;
/**采购天数*/
@JSONField(name = "purchaseDays")
private int purchaseDays;
@JSONField(name = "minPurchaseQuantity")
private int minPurchaseQuantity;
@JSONField(name = "maxPurchaseQuantity")
private int maxPurchaseQuantity;
}

View File

@ -85,7 +85,7 @@ public class SkuAddRequestBody implements RequestBody {
this.declareValue = data.getDeclareValue();
this.declareName = data.getDeclareNameZh();
this.declareEname = data.getDeclareNameEn();
this.warehouse = data.getWarehouse();
this.warehouse = data.getWarehouseName();
this.remark = data.getSaleRemark();
this.hasBattery = data.getHasBattery();
this.magnetic = data.getMagnetic();

View File

@ -20,12 +20,21 @@ public class SkuAddResponse extends Response {
private final String stockSku;
private String message;
public SkuAddResponse(Code code, JSONObject data, String stockId, String stockSku) {
super(code);
this.data = data;
this.stockId = stockId;
this.stockSku = stockSku;
}
public SkuAddResponse(Code code, JSONObject data, String stockId, String stockSku, String message) {
super(code);
this.data = data;
this.stockId = stockId;
this.stockSku = stockSku;
this.message = message;
}
/**
* Make an instance by parsing json, it only checks validity of code.

View File

@ -4,19 +4,23 @@ import lombok.extern.slf4j.Slf4j;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.*;
import org.jeecg.modules.business.service.ISkuListMabangService;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class MabangUnpairedSkuJob implements Job {
@Autowired
private ISkuListMabangService skuListMabangService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getMergedJobDataMap();
@ -40,11 +44,7 @@ public class MabangUnpairedSkuJob implements Job {
return;
}
SkuListRequestBody body = new SkuListRequestBody();
body.setStockSkuList(String.join(",", skuList));
SkuListRawStream rawStream = new SkuListRawStream(body);
UnpairedSkuListStream stream = new UnpairedSkuListStream(rawStream);
List<SkuData> skusFromMabang = stream.all();
List<SkuData> skuDatas = skuListMabangService.fetchUnpairedSkus(skuList);
// System.out.println("skus from mabang : " + skusFromMabang);
}
}

View File

@ -19,4 +19,8 @@ public interface SensitiveAttributeMapper extends BaseMapper<SensitiveAttribute>
String getHighestPriorityAttributeId(@Param("orderId") String orderId);
List<SensitiveAttribute> listIdAndPriority();
String getNameByAttributes(@Param("attribute") SensitiveAttribute sensitiveAttribute);
SensitiveAttribute getByZhName(@Param("zhName") String zhName);
}

View File

@ -80,4 +80,8 @@ public interface SkuMapper extends BaseMapper<Sku> {
List<Sku> listImgUrls();
List<String> fetchAllClientSkuCodes(@Param("clientCode") String clientCode);
List<String> fetchUnpairedSkus(@Param("shopId") String shopId, @Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order);
int countUnpairedSkus(@Param("shopId") String shopId);
}

View File

@ -29,4 +29,20 @@
SELECT id, priority, zh_name
FROM wia_app.sensitive_attribute
</select>
<select id="getNameByAttributes" resultType="java.lang.String">
SELECT zh_name
FROM sensitive_attribute sa
WHERE sa.is_paste = #{attribute.isPaste}
AND sa.is_knife = #{attribute.isKnife}
AND sa.is_flammable = #{attribute.isFlammable}
AND sa.powder = #{attribute.powder}
AND sa.has_battery = #{attribute.hasBattery}
AND sa.magnetic = #{attribute.magnetic}
AND sa.no_liquid_cosmetic = #{attribute.noLiquidCosmetic}
</select>
<select id="getByZhName" resultType="org.jeecg.modules.business.entity.SensitiveAttribute">
SELECT *
FROM sensitive_attribute sa
WHERE sa.zh_name = #{zhName};
</select>
</mapper>

View File

@ -790,4 +790,30 @@
JOIN client c ON client_sku.client_id = c.id
WHERE c.internal_code = #{clientCode};
</select>
<select id="fetchUnpairedSkus" resultType="java.lang.String">
SELECT poc.sku_id as erp_code
FROM platform_order po
JOIN shop s ON po.shop_id = s.id
JOIN platform_order_content poc ON po.id = poc.platform_order_id
LEFT JOIN sku ON poc.sku_id = sku.id
WHERE sku.id IS NULL
AND po.erp_status IN (1, 2)
AND poc.erp_status &lt;&gt; 5
AND s.id = #{shopId}
GROUP BY poc.sku_id
ORDER BY ${column} ${order}
LIMIT #{offset}, #{size};
</select>
<select id="countUnpairedSkus" resultType="java.lang.Integer">
SELECT COUNT(DISTINCT poc.sku_id)
FROM platform_order_content poc
JOIN platform_order po ON poc.platform_order_id = po.id
JOIN shop s ON po.shop_id = s.id
LEFT JOIN sku ON poc.sku_id = sku.id
WHERE sku.id IS NULL
AND po.erp_status IN (1, 2)
AND poc.erp_status &lt;&gt; 5
AND s.id = #{shopId};
</select>
</mapper>

View File

@ -17,4 +17,8 @@ public interface ISensitiveAttributeService extends IService<SensitiveAttribute>
String getHighestPriorityAttributeId(String orderId);
List<SensitiveAttribute> listIdAndPriority();
String getNameByAttributes(SensitiveAttribute sensitiveAttribute);
SensitiveAttribute getByZhName(String zhName);
}

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuData;
import org.jeecg.modules.business.entity.Sku;
import org.jeecg.modules.business.entity.SkuWeight;
import org.jeecg.modules.business.vo.Responses;
import org.jeecg.modules.business.vo.ResponsesWithMsg;
import org.jeecg.modules.business.vo.SkuOrderPage;
import java.util.List;
@ -33,12 +33,18 @@ public interface ISkuListMabangService extends IService<SkuData> {
List<String> parseSkuListToProductCodeList(List<SkuData> erpCodeList) throws Exception;
Map<Sku, String> createSkus(List<SkuData> skuDataList);
Responses publishSkuToMabang(List<SkuOrderPage> skuList);
ResponsesWithMsg publishSkuToMabang(List<SkuOrderPage> skuList);
Map<Sku, String> skuSyncUpsert(List<String> erpCodes);
void updateSkuId();
void mabangSkuStockUpdate(List<String> erpCodes);
Responses mabangSkuWeightUpdate(List<SkuWeight> skuWeights);
ResponsesWithMsg mabangSkuWeightUpdate(List<SkuWeight> skuWeights);
List<SkuData> fetchUnpairedSkus(List<String> stockSkuList);
List<SkuOrderPage> unpairedSkus(String shopId, Integer pageNo, Integer pageSize, String column, String order);
int countUnpairedSkus(String shopId);
}

View File

@ -124,4 +124,8 @@ public interface ISkuService extends IService<Sku> {
List<Sku> listImgUrls();
List<String> fetchAllClientSkuCodes(String clientCode);
List<String> fetchUnpairedSkus(String shopId, int offset, Integer pageSize, String column, String order);
int countUnpairedSkus(String shopId);
}

View File

@ -35,4 +35,14 @@ public class SensitiveAttributeServiceImpl extends ServiceImpl<SensitiveAttribut
public List<SensitiveAttribute> listIdAndPriority() {
return sensitiveAttributeMapper.listIdAndPriority();
}
@Override
public String getNameByAttributes(SensitiveAttribute sensitiveAttribute) {
return sensitiveAttributeMapper.getNameByAttributes(sensitiveAttribute);
}
@Override
public SensitiveAttribute getByZhName(String zhName) {
return sensitiveAttributeMapper.getByZhName(zhName);
}
}

View File

@ -22,7 +22,7 @@ import org.jeecg.modules.business.entity.*;
import org.jeecg.modules.business.mapper.SkuListMabangMapper;
import org.jeecg.modules.business.mongoService.SkuMongoService;
import org.jeecg.modules.business.service.*;
import org.jeecg.modules.business.vo.Responses;
import org.jeecg.modules.business.vo.ResponsesWithMsg;
import org.jeecg.modules.business.vo.SkuOrderPage;
import org.jeecg.modules.online.cgform.mapper.OnlCgformFieldMapper;
import org.springframework.beans.factory.annotation.Autowired;
@ -466,7 +466,8 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
}
return remark;
}
public Responses publishSkuToMabang(List<SkuOrderPage> skuList) {
public ResponsesWithMsg publishSkuToMabang(List<SkuOrderPage> skuList) {
ResponsesWithMsg responses = new ResponsesWithMsg();
List<SkuData> skuDataList = skuList.stream()
.map(this::SkuOrderPageToSkuData)
.collect(toList());
@ -483,7 +484,7 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
return request.send();
} catch (Exception e) {
log.error("Error publishing sku {} to mabang : {}", requestBody.getStockSku(), e.getMessage());
return new SkuAddResponse(Response.Code.ERROR, null, null, requestBody.getStockSku());
return new SkuAddResponse(Response.Code.ERROR, null, null, requestBody.getStockSku(), e.getMessage());
}
}, executor))
.collect(toList());
@ -494,13 +495,13 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
.filter(SkuAddResponse::success)
.map(SkuAddResponse::getStockSku)
.collect(toList());
List<String> failures = results.stream()
.filter(response -> !response.success())
.map(SkuAddResponse::getStockSku)
.collect(toList());
Responses responses = new Responses();
responses.setSuccesses(successes);
responses.setFailures(failures);
results.forEach(response -> {
if(response.success()) {
responses.addSuccess(response.getStockSku());
} else {
responses.addFailure(response.getStockSku(), response.getMessage());
}
});
return responses;
}
@ -544,7 +545,12 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
public SkuData SkuOrderPageToSkuData(SkuOrderPage skuOrderPage) {
SensitiveAttribute sensitiveAttribute = sensitiveAttributeService.getById(skuOrderPage.getSensitiveAttribute());
if(sensitiveAttribute == null) {
sensitiveAttribute = sensitiveAttributeService.getByZhName(skuOrderPage.getSensitiveAttribute());
}
SkuData skuData = new SkuData();
if(skuOrderPage.getId() != null)
skuData.setVirtualSkus(skuOrderPage.getId());
skuData.setErpCode(skuOrderPage.getErpCode());
skuData.setNameCN(skuOrderPage.getZhName());
skuData.setNameEN(skuOrderPage.getEnName());
@ -552,7 +558,7 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
skuData.setDeclareNameEn(skuOrderPage.getDeclareEname());
skuData.setSalePrice(skuOrderPage.getSkuPrice());
skuData.setDeclareValue(skuOrderPage.getDeclaredValue());
skuData.setWarehouse(DEFAULT_WAREHOUSE_NAME);
skuData.setWarehouseName(DEFAULT_WAREHOUSE_NAME);
if(skuOrderPage.getWeight() != null)
skuData.setSaleRemark(skuOrderPage.getWeight().toString());
skuData.setHasBattery(sensitiveAttribute.getHasBattery());
@ -568,6 +574,33 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
return skuData;
}
public SkuOrderPage SkuDataToSkuOrderPage(SkuData skuData) {
SkuOrderPage sop = new SkuOrderPage();
SensitiveAttribute sensitiveAttribute = new SensitiveAttribute();
sensitiveAttribute.setHasBattery(skuData.getHasBattery());
sensitiveAttribute.setPowder(skuData.getPowder());
sensitiveAttribute.setIsFlammable(skuData.getIsFlammable());
sensitiveAttribute.setIsKnife(skuData.getIsKnife());
sensitiveAttribute.setIsPaste(skuData.getIsPaste());
sensitiveAttribute.setMagnetic(skuData.getMagnetic());
sensitiveAttribute.setNoLiquidCosmetic(skuData.getNoLiquidCosmetic());
String sensitiveAttributeName = sensitiveAttributeService.getNameByAttributes(sensitiveAttribute);
sop.setSensitiveAttribute(sensitiveAttributeName);
sop.setId(String.valueOf(skuData.getStockSkuId()));
sop.setErpCode(skuData.getErpCode());
sop.setZhName(skuData.getNameCN());
sop.setEnName(skuData.getNameEN());
sop.setDeclaredValue(skuData.getDeclareValue());
sop.setSkuPrice(skuData.getSalePrice());
if(skuData.getWarehouse() != null)
sop.setWarehouse(skuData.getWarehouse()[0].getWarehouseName());
sop.setImageSource(skuData.getSalePicture());
sop.setIsGift(skuData.getIsGift());
sop.setSupplier(skuData.getSupplier());
sop.setSupplierLink(skuData.getSupplierLink());
sop.setStatus(skuData.getStatusValue());
return sop;
}
/**
* Call a routine to replace SKU codes (from MabangAPI)
@ -635,9 +668,8 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
}
@Override
public Responses mabangSkuWeightUpdate(List<SkuWeight> skuWeights) {
Responses responses = new Responses();
List<String> failures = new ArrayList<>();
public ResponsesWithMsg mabangSkuWeightUpdate(List<SkuWeight> skuWeights) {
ResponsesWithMsg responses = new ResponsesWithMsg();
List<String> skuIds = skuWeights.stream()
.map(SkuWeight::getSkuId)
.collect(toList());
@ -701,7 +733,7 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
.orElse(null);
if(null == skuInDb) {
log.error("Sku not found : {}", skuWeight.getSkuId());
failures.add(skuWeight.getSkuId());
responses.addFailure(skuWeight.getSkuId(), "Sku not found");
return null;
}
if(null == sku) {
@ -745,17 +777,47 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
List<SkuChangeResponse> results = futures.stream().map(CompletableFuture::join).collect(toList());
long successCount = results.stream().filter(SkuChangeResponse::success).count();
log.info("{}/{} skus updated successfully.", successCount, skuDataList.size());
List<String> successes = results.stream()
.filter(SkuChangeResponse::success)
.map(response -> response.getStockSku() + " : Mabang OK")
.collect(toList());
failures.addAll(results.stream()
.filter(response -> !response.success())
.map(response -> response.getStockSku() + " | Mabang")
.collect(toList()));
responses.getSuccesses().addAll(successes);
responses.setFailures(failures);
results.forEach(response -> {
if(response.success()) {
responses.addSuccess(response.getStockSku(), "Mabang");
}
else {
responses.addFailure(response.getStockSku(), "Mabang");
}
});
return responses;
}
@Override
public List<SkuData> fetchUnpairedSkus(List<String> stockSkuList) {
List<List<String>> skusPartition = Lists.partition(new ArrayList<>(stockSkuList), 50);
List<SkuData> skuDataList = new ArrayList<>();
for(List<String> skuPartition : skusPartition) {
SkuListRequestBody body = new SkuListRequestBody();
body.setShowWarehouse(1);
body.setStockSkuList(String.join(",", skuPartition));
SkuListRawStream rawStream = new SkuListRawStream(body);
UnpairedSkuListStream stream = new UnpairedSkuListStream(rawStream);
skuDataList.addAll(stream.all());
}
return skuDataList;
}
@Override
public List<SkuOrderPage> unpairedSkus(String shopId, Integer pageNo, Integer pageSize, String column, String order) {
int offset = (pageNo - 1) * pageSize;
List<String> stockSkuList = skuService.fetchUnpairedSkus(shopId, offset, pageSize, column, order);
if(stockSkuList.isEmpty()){
return new ArrayList<>();
}
List<SkuData> skuDataList = fetchUnpairedSkus(stockSkuList);
return skuDataList.stream()
.map(this::SkuDataToSkuOrderPage)
.collect(toList());
}
@Override
public int countUnpairedSkus(String shopId) {
return skuService.countUnpairedSkus(shopId);
}
}

View File

@ -59,8 +59,6 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
@Autowired
private ILogisticChannelPriceService logisticChannelPriceService;
@Autowired
private CountryService countryService;
@Autowired
private IPlatformOrderContentService platformOrderContentService;
@Autowired
private ISkuLogisticChoiceService skuLogisticChoiceService;
@ -619,4 +617,13 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
return skuMapper.fetchAllClientSkuCodes(clientCode);
}
@Override
public List<String> fetchUnpairedSkus(String shopId, int offset, Integer pageSize, String column, String order) {
return skuMapper.fetchUnpairedSkus(shopId, offset, pageSize, column, order);
}
@Override
public int countUnpairedSkus(String shopId) {
return skuMapper.countUnpairedSkus(shopId);
}
}

View File

@ -0,0 +1,128 @@
package org.jeecg.modules.business.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.math.BigDecimal;
/**
* @Description: SKU
* @Author: jeecg-boot
* @Date: 2024-03-25
* @Version: V1.1
*/
@Data
@ApiModel(value = "skuOrderPage对象", description = "SKU表")
public class NewSkuPage {
/**
*
*/
@Excel(name = "马帮动创建Sku", width = 15)
@ApiModelProperty(value = "马帮动创建Sku")
private String mabangSku;
/**
* ID
*/
@Excel(name = "商品", width = 15)
@ApiModelProperty(value = "商品")
private String zhName;
/**
* ID
*/
@Excel(name = "商品英文", width = 15)
@ApiModelProperty(value = "商品英文")
private String enName;
/**
* ERP
*/
@Excel(name = "ERP中商品代码", width = 15)
@ApiModelProperty(value = "ERP中商品代码")
private String erpCode;
/**
*
*/
@Excel(name = "重量", width = 15)
@ApiModelProperty(value = "重量")
private Integer weight;
/**
*
*/
@Excel(name = "图片链接", width = 15)
@ApiModelProperty(value = "图片链接")
private String imageSource;
/**
*
*/
@Excel(name = "运费折扣", width = 15)
@ApiModelProperty(value = "运费折扣")
private BigDecimal shippingDiscount;
/**
*
*/
@Excel(name = "服务费", width = 15)
@ApiModelProperty(value = "服务费")
private BigDecimal serviceFee;
/**
*
* 1:;2:;3:;4:;5:"
* default : 3
*/
@Excel(name = "状态", width = 15)
@ApiModelProperty(value = "状态")
private Integer status;
/**
*
*/
@Excel(name = "敏感属性", width = 15)
@ApiModelProperty(value = "敏感属性")
private String sensitiveAttribute;
/**
*
* 1 2
*/
@Excel(name = "是否赠品", width = 15)
@ApiModelProperty(value = "是否赠品")
private Integer isGift;
/**
* SKU
*/
@ApiModelProperty(value = "SKU价格")
private BigDecimal skuPrice;
/**
*
*/
@Excel(name = "申报价格", width = 15)
@ApiModelProperty(value = "申报价格")
private BigDecimal declaredValue;
/**
*
*/
@Excel(name = "申报中文名称", width = 15)
@ApiModelProperty(value = "申报中文名称")
private String declareName;
/**
*
*/
@Excel(name = "申报英文名称", width = 15)
@ApiModelProperty(value = "申报英文名称")
private String declareEname;
/**
*
*/
@Excel(name = "供应商", width = 15)
@ApiModelProperty(value = "供应商")
private String supplier;
/**
*
*/
@Excel(name = "供应商商品网址", width = 15)
@ApiModelProperty(value = "供应商商品网址")
private String supplierLink;
@Excel(name = "仓库", width = 15)
@ApiModelProperty(value = "仓库")
private String warehouse;
}

View File

@ -0,0 +1,45 @@
package org.jeecg.modules.business.vo;
import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
public class ResponsesWithMsg {
private Map<String, List<String>> successes = new HashMap<>();
private Map<String, List<String>> failures = new HashMap<>();
public void addSuccess(String message) {
successes.putIfAbsent(message, new ArrayList<>());
}
public void addSuccess(String key, String message) {
if (!successes.containsKey(key)) {
successes.put(key, new ArrayList<>());
}
successes.get(key).add(message);
}
public void addSuccess(String key, List<String> messages) {
if (!successes.containsKey(key)) {
successes.put(key, new ArrayList<>());
}
successes.get(key).addAll(messages);
}
public void addFailure(String message) {
failures.putIfAbsent(message, new ArrayList<>());
}
public void addFailure(String key, String message) {
if (!failures.containsKey(key)) {
failures.put(key, new ArrayList<>());
}
failures.get(key).add(message);
}
public void addFailure(String key, List<String> messages) {
if (!failures.containsKey(key)) {
failures.put(key, new ArrayList<>());
}
failures.get(key).addAll(messages);
}
}

View File

@ -4,7 +4,6 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecgframework.poi.excel.annotation.ExcelCollection;
import java.math.BigDecimal;
@ -131,7 +130,6 @@ public class SkuOrderPage {
/**
* SKU
*/
@ExcelCollection(name = "SKU价格")
@ApiModelProperty(value = "SKU价格")
private java.math.BigDecimal skuPrice;
/**
@ -206,4 +204,8 @@ public class SkuOrderPage {
@Excel(name = "供应商商品网址", width = 15)
@ApiModelProperty(value = "供应商商品网址")
private String supplierLink;
@Excel(name = "仓库", width = 15)
@ApiModelProperty(value = "仓库")
private String warehouse;
}