Last active
July 3, 2024 03:47
-
-
Save mdull99/b9df0d75404ca19e780dc079167f6aea to your computer and use it in GitHub Desktop.
xxx.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
define([ | |
"csi/api", | |
"csi/types", | |
"csi/xml", | |
"csi/widget/MessageDialog", | |
"csi/locale", | |
"csi/resolver", | |
"dojo/topic", | |
"dojo/_base/lang", | |
"csi/def/Action", | |
"csi/session", | |
"csi/state/rootStore", | |
"csi/page", | |
"csi/comm", | |
"csi/xml/Query", | |
"csi/xml/Search", | |
"csi/comm/PostRequest" | |
], function(api,types,xml,MessageDialog,locale,resolver,topic,lang,Action,session,{ sessionStore, routerStore },page,comm,Query,Search,PostRequest) { | |
//全局变量定义 | |
var pluginsURL = window.location.origin + "/plmservice"; | |
var currentUserUrl = sessionStore.currentUser.$URL; | |
var currentUserNode = sessionStore.currentUser; | |
//var currentUserName = sessionStore.currentUser.$Name; | |
var currentRole = sessionStore.currentUser.$Name; | |
//用户控制否打印组货相关的控制台日志,如果MiddleName=log | |
var currentUserMidName = currentUserNode.MiddleName; | |
// 获取过滤表格url list | |
function wrapCnls(ac) { | |
var cnlArray = ac.widget.getQueryResult().getChildResultUrls(); | |
var cnls = ""; | |
if (cnlArray.length === 0) { | |
jp.alert("未过滤数据!"); | |
return cnls; | |
} | |
if (cnlArray.length > 1000) { | |
jp.alert("单次选择不成超过500条数据,请筛选后重新操作"); | |
return cnls; | |
} | |
for (var i = 0; i < cnlArray.length; i++) { | |
if (cnls.length > 0) | |
cnls += ","; | |
cnls += cnlArray[i]; | |
} | |
return cnls; | |
} | |
// 从缓存中取对象,如果没有缓存,则直接添加到缓存 | |
function getNode(ac, url) { | |
return ac.m_cache.getNode(url) ? ac.m_cache.getNode(url) : ac.m_cache.addNode(url); | |
} | |
//1、如果配置了失效日期;如果缓存存入的时间小于失效日期,则清空缓存 | |
//2、缓存最多有效时间为2小时 | |
function getLocalStorage() { | |
var filedCache = localStorage.getItem("C8_Field_Right"); | |
if (filedCache) { | |
//已经有缓存 | |
var filedCacheNode = JSON.parse(filedCache); | |
var expire = new Date(filedCacheNode.expire); | |
var json = [{ | |
attr: "Node Name", value: "字段权限", type: "string", op: "EQ", path: "Child:Subtype" | |
}, {attr: "Node Name", value: "缓存失效时间", type: "string", op: "EQ"}]; | |
var node = getCommonURLMulAttr("LookupItem", json, "", "", true); | |
if (node) { | |
if (node.C8_LI_CacheTime > expire) { | |
return searchFieldRight();//重新获取缓存 | |
} else if (new Date() - expire > 2 * 60 * 60 * 1000) { | |
//缓存超过2小时 | |
return searchFieldRight(); | |
} | |
return filedCacheNode; | |
} | |
} else { | |
return searchFieldRight();//无缓存 | |
} | |
} | |
//根据type和node name获取URL | |
//array为数组,内部是json,属性为attr,op,value,type,path | |
function getCommonURLMulAttr(type, array, url, op, isNode) { | |
var mtResults = getCommonURLMulAttrList(type, array, url, op); | |
if (mtResults.length > 0) { | |
if (isNode) { | |
return mtResults[0]; | |
} else { | |
return mtResults[0].$URL; | |
} | |
} | |
return ""; | |
} | |
var rules = {} | |
//获取权限规则 | |
function searchFieldRight() { | |
var rules = {} | |
var json = [{attr: "Node Name", value: "字段权限", type: "string", op: "EQ", path: "Child:Subtype"}]; | |
var mtResults = getCommonURLMulAttrList("LookupItem", json, "", ""); | |
mtResults.forEach(function (x) { | |
var v_rule = new Array(); | |
if (x.C8_LI_RuleEXP.length > 0) { | |
var v_exp = x.C8_LI_RuleEXP.replace(/([^\u0000-\u00FF])/g, function ($) { | |
return escape($).toLowerCase().replace(/%u/g, "\\u"); | |
}).replace("-", "\\u002d"); | |
var v_expstr = {m_exp: v_exp} | |
v_rule.push(v_expstr); | |
} | |
if (x.C8_LI_RuleEXP1.length > 0) { | |
var v_exp1 = x.C8_LI_RuleEXP1.replace(/([^\u0000-\u00FF])/g, function ($) { | |
return escape($).toLowerCase().replace(/%u/g, "\\u"); | |
}).replace("-", "\\u002d"); | |
var v_expstr = {m_exp: v_exp1}; | |
v_rule.push(v_expstr); | |
} | |
if (v_rule.length > 0) { | |
if (!rules.hasOwnProperty(x.C8_LI_AuditBO)) { | |
rules[x.C8_LI_AuditBO] = {} | |
} | |
;rules[x.C8_LI_AuditBO][x.C8_LI_AuditAttr] = v_rule; | |
} | |
}) | |
setLocalStorage(rules); | |
return rules; | |
} | |
function getCommonURLMulAttrList(type, array, url, op) { | |
var mtquery = new Search(); | |
var mq = mtquery.getQuery(); | |
mq.Node(xml.PROP_TYPE, xml.OP_EQUALS, type); | |
if (op == "" || op == undefined) { | |
op = "EQ"; | |
} | |
if (url != "" && url != undefined) { | |
mq.Node(xml.PROP_URL, op, url); | |
} | |
for (var i = 0; i < array.length; i++) { | |
var attr = array[i].attr; | |
var op1 = array[i].op; | |
var value = array[i].value; | |
var type = array[i].type; | |
var path = array[i].path; | |
if (op1 == "" || op1 == undefined) { | |
op1 = "EQ"; | |
} | |
if (type != undefined && type.indexOf("ref") > -1) { | |
mq.RefAttr(attr, op1, value, path); | |
} else { | |
mq.Attr(attr, op1, value, path); | |
} | |
} | |
var resmt = mtquery.execute({sync: true}); | |
return resmt.getResultNodes(); | |
} | |
//将权限规则保存至本地;并设置当前时间 | |
function setLocalStorage(obj) { | |
obj.expire = new Date();//设置有效时间 | |
localStorage.setItem("C8_Field_Right", JSON.stringify(obj)); | |
} | |
// 发送邮件 给角色 | |
function SendMailToRole(ac, roleName, subject, content, urltext) { | |
var roleNode = ""; | |
var arrUser = Array(); | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "Role") | |
.Attr("Node Name", xml.OP_EQUALS, roleName); | |
var res = search.execute({ | |
sync: true | |
}); | |
var results = res.getResultNodes(); | |
if (results.length > 0) { | |
roleNode = results[0]; | |
} | |
var Assignment = ""; | |
var __Members__ = ""; | |
Assignment = ac.m_cache.getNode(roleNode.Assignment, true); | |
if (Assignment.__Members__.length > 0) { | |
for (var i = 0; i < Assignment.__Members__.length; i++) { | |
arrUser.push(Assignment.__Members__[i]); | |
} | |
} | |
uniqueArr(arrUser); | |
content += "\n"; | |
content += urltext; | |
if (arrUser.length > 0) { | |
ac.m_writer.callMethod("SiteAdmin", "EmailPageLink") | |
.addParameter("SendTo", "reflist", arrUser) | |
.addParameter("Subject", "string", subject) | |
.addParameter("ContentType", "string", "text/html") | |
.addParameter("Text", "string", content); | |
//jp.alert("邮件发送成功!"); | |
}; | |
} | |
// 数组去重 | |
function uniqueArr(array) { | |
var n = []; //一个新的临时数组 | |
//遍历当前数组 | |
for (var i = 0; i < array.length; i++) { | |
//如果当前数组的第i已经保存进了临时数组,那么跳过, | |
//否则把当前项push到临时数组里面 | |
if (n.indexOf(array[i]) == -1) | |
n.push(array[i]); | |
} | |
return n; | |
} | |
//校验字段权限 | |
function checkFieldRight(view) { | |
if (view.defView.m_typeView != "Tabs" && view.defView.m_typeView != "Html" && view.defView.m_typeView != "Form") { | |
if (!view.defView.dataPointResolver || !view.defView.dataPointResolver.rcPage) { | |
return; | |
} | |
var nodetype = view.defView.dataPointResolver.rcPage.m_type; | |
if (!currentRole) { | |
return; | |
} | |
if (JSON.stringify(rules) != '{}') { | |
//设置当前视图字段rule exp | |
view.defView.m_headings.forEach(function (heading) { | |
var headList = []; | |
if (heading.bMatrixGroup) { | |
heading.m_subheadings.forEach(function (subHeading) { | |
headList.push(subHeading); | |
}) | |
} else { | |
headList.push(heading); | |
} | |
headList.forEach(function (heading) { | |
//获取字段所在BO | |
if (!heading._rc) { | |
return; | |
} | |
if (!heading._rc.m_type) { | |
return; | |
} | |
var attrbo = heading._rc.m_type; | |
var v_exps = ''; | |
//依次判断权限设置中是否包含相应的BO设置、字段设置 | |
if (rules.hasOwnProperty(attrbo)) { | |
if (rules[attrbo].hasOwnProperty(heading.m_id)) { | |
//判断是否已经存在m_action m_rules设置 或 未定义,(如 xml中字段的ref定义等) | |
if (!heading.hasOwnProperty('m_action') || !heading.m_action) { | |
heading.m_action = lang.mixin(new Action(), { | |
m_rules: [], | |
m_id: "Action", | |
m_name: "Action", | |
m_right: "Write", | |
m_typeControl: "Link" | |
}); | |
} | |
if (!heading.m_action.hasOwnProperty('m_rules') || !heading.m_action.m_rules) { | |
heading.m_action["m_rules"] = []; | |
} | |
rules[attrbo][heading.m_id].forEach(function (y, i) { | |
heading.m_action.m_rules.push({ | |
m_exp: y.m_exp, bApplyToForm: false, __proto__: proto.__proto__ | |
}); | |
v_exps = y.m_exp + '; ' + v_exps; | |
}) | |
} | |
} | |
//管理员角色时,显示字段提示信息,辅助查看权限设置 | |
if (currentRole == "Administrator") { | |
heading.m_tooltip = heading.m_id + ':' + unescape(v_exps.replace(/\\/g, "%")); | |
} | |
}) | |
}); | |
} | |
} | |
} | |
//获取enum的Value值,去掉enumList的名称 | |
function getEnumValue(enumValue){ | |
var retStr = ""; | |
if(!enumValue || enumValue==null || enumValue==""){ | |
retStr = ""; | |
}else{ | |
if(enumValue.indexOf(":")>0){ | |
var index = enumValue.indexOf(":"); | |
if(enumValue.endsWith(":")){ | |
retStr = ""; | |
}else{ | |
retStr = enumValue.substring(index+1); | |
} | |
}else{ | |
retStr = ""; | |
} | |
} | |
return retStr; | |
} | |
// 查找Node Type+Node Name唯一的对象URL,如类型等 | |
function searchNodeURL(type, name) { | |
var returnValue = ""; | |
var resultNode = searchNode(type,name); | |
if(resultNode){ | |
returnValue = resultNode.$URL; | |
} | |
return returnValue; | |
}; | |
// 查找Node Type+Node Name唯一的对象URL,如类型等 | |
function searchNode(type, name) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
var returnValue; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, type) | |
.Attr("Node Name", xml.OP_EQUALS, name); | |
var res = search.execute({ | |
sync: true | |
}); | |
var results = res.getResultNodes(); | |
if (results.length != 0 && results.length != null) { | |
returnValue = results[0]; | |
} | |
return returnValue; | |
}; | |
// 查找Node Type+Code 唯一的对象URL,如产品等 | |
function searchNodebyCode(type, code) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
var returnValue = ""; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, type) | |
.Attr("Code", xml.OP_EQUALS, code); | |
var res = search.execute({ | |
sync: true | |
}); | |
var results = res.getResultNodes(); | |
if (results.length != 0 && results.length != null) { | |
returnValue = results[0]; | |
} | |
return returnValue; | |
}; | |
// 查找Node Type+Node Name唯一的对象URL,如类型等 | |
function searchNodeURLWithParent(type, name, parentURL) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
var returnValue = ""; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, type) | |
.Attr("Node Name", xml.OP_EQUALS, name) | |
.RefAttr("__Parent__", xml.OP_EQUALS, parentURL); | |
var res = search.execute({ | |
sync: true | |
}); | |
var results = res.getResultNodes(); | |
if (results.length != 0 && results.length != null) { | |
returnValue = results[0].$URL; | |
} | |
return returnValue; | |
}; | |
// 查找规则表 - dependcyPath查询每张表的规则 | |
function searchRuleTable(monthNode) { | |
var ruleTable = {}; | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "SpecificationDataSheet") | |
.RefAttr("C8_SD_YearSeaon", xml.OP_EQUALS, monthNode.C8_MC_Season) | |
.Attr("C8_SD_Channel", xml.OP_EQUALS, monthNode.C8_MC_Channel) | |
.Attr("C8_SD_Brand", xml.OP_EQUALS, monthNode.C8_MC_Brand) | |
.Attr("C8_SD_ProductSeriation", xml.OP_EQUALS, monthNode.C8_MC_Series) | |
.RefAttr("__Parent__", xml.OP_EQUALS, "centric://REFLECTION/INSTANCE/_CS_Data/null"); | |
var dependcyPath = ["Child:CurrentRevision/Child:Items"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
var rulesNode = res.getNonResultNodes(); | |
//将规则表按照编号存储 | |
if(rulesNode){ | |
rulesNode.forEach(function(node,index){ | |
if(node.$Type == "SpecificationDataSheetItem"){ | |
var tableNum = getEnumValue(node.UR_SDS_TableRule); | |
if(tableNum && tableNum!=""){ | |
if(ruleTable[tableNum]){ | |
ruleTable[tableNum].push(node); | |
}else{ | |
ruleTable[tableNum]=[]; | |
ruleTable[tableNum].push(node); | |
} | |
} | |
} | |
}); | |
} | |
return ruleTable; | |
}; | |
//查找品类管控规则 Agnes: 品类管控变更 | |
function searchControlRules(monthNode) { | |
var keySet = new Set(); | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "SpecificationDataSheet") | |
.Attr("Node Name", xml.OP_EQUALS, "组货管控规则", "Child:Subtype") | |
.Attr("C8_SD_Channel", xml.OP_EQUALS, monthNode.C8_MC_Channel) | |
.Attr("C8_SD_Brand", xml.OP_EQUALS, monthNode.C8_MC_Brand) | |
.Attr("C8_SD_ProductSeriation", xml.OP_EQUALS, monthNode.C8_MC_Series) | |
.RefAttr("__Parent__", xml.OP_EQUALS, "centric://REFLECTION/INSTANCE/_CS_Data/null"); | |
var dependcyPath = ["Child:CurrentRevision/Child:Items"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
var rulesNode = res.getNonResultNodes(); | |
//将规则内容提取控制keyset:(渠道_品牌_系列,不需要,组货的skc这部分都相同)品类_中品类_子品类_级别 | |
if(rulesNode){ | |
rulesNode.forEach(function(node,index){ | |
if(node.$Type == "SpecificationDataSheetItem"){ | |
//getEnumValue(monthNode.C8_MC_Channel) + getEnumValue(monthNode.C8_MC_Brand) + getEnumValue(monthNode.C8_MC_Series) + | |
var key = getEnumValue(node.UR_SDS_ProductLargeType) + getEnumValue(node.UR_SDS_MiddleCategoryType) + getEnumValue(node.UR_SDS_Silhouette) + getEnumValue(node.UR_SDS_DSLevel); | |
keySet.add(key); | |
} | |
}); | |
} | |
return keySet; | |
} | |
/** | |
* 创建会话Comments Agnes 20231019 | |
* docContainer: DocumentContainer URL | |
* subject: 会话主题 | |
* mentions: @的用户URL list | |
* comments: 会话内容 | |
*/ | |
function createConversation(ac, docContainer, subject, mentions, comments) { | |
var newUrl = comm.createUrl("Comment"); | |
ac.m_writer.createNode(newUrl, "Comment") | |
.changeAttribute("Node Name", "string", subject) | |
.changeAttribute("Author", "ref", currentUserUrl) | |
.changeAttribute("Revision", "ref", "centric:") | |
.changeAttribute("ThreeDInfo", "string", null) | |
.changeAttribute("Comment", "string", comments) | |
.changeAttribute("Mentions", "refset", mentions); | |
ac.m_writer.callMethod("SiteAdmin", "AttachComment") | |
.addParameter("ParentURL", "ref", docContainer) | |
.addParameter("URL", "ref", newUrl); | |
} | |
//通过用户组名称取用户 | |
function getGroup(ac, name) { | |
var GroupAssignment = searchNodeURL("GroupAssignment", name); | |
var groupNode = getNode(ac, GroupAssignment); | |
var list = []; | |
var users = groupNode.__Members__; | |
for (var i = 0; i < users.length; i++) { | |
list.push(users[i]); | |
} | |
return list; | |
}; | |
//获取月度目标的key-商品层-品类-中类 | |
function getMonthTargetKey(monthTargetNode,isDisplay,isDianShang){ | |
var commodityType = monthTargetNode.C8_MCM_CommodityType; | |
var category = monthTargetNode.C8_MCM_ProductLargeType; | |
var midCategory = monthTargetNode.C8_MCM_CategoryInPlan; | |
var classLevel = monthTargetNode.C8_MCM_DSLevel; | |
var subCategory = monthTargetNode.UR_MCM_Silhouette; | |
if(isDianShang){ | |
if(isDisplay){ | |
return "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】【"+locale.getEnumName(classLevel)+"】"; | |
}else{ | |
return getEnumValue(commodityType)+getEnumValue(category)+getEnumValue(midCategory)+getEnumValue(classLevel)+getEnumValue(subCategory); | |
} | |
}else{ | |
if(isDisplay){ | |
return "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】"; | |
}else{ | |
return getEnumValue(commodityType)+getEnumValue(category)+getEnumValue(midCategory)+getEnumValue(subCategory); | |
} | |
} | |
} | |
//根据条件获取规则表条目 | |
//filterRule: {} 规则表字段,全部符合才返回,主要用于过滤商品层,品类,中品类等维度 | |
function filterRuleTable(ruleTable,tableNum,ifFirst,filterRule){ | |
var returnRules = []; | |
if(tableNum && ruleTable[tableNum]){ | |
ruleTable[tableNum].forEach(function(ruleNode,index){ | |
if(filterRule){ | |
var ifReturn = true; | |
Object.keys(filterRule).forEach(function(rule){ | |
var targetValue = filterRule[rule]; | |
var nodeValue = ruleNode[rule]; | |
if(targetValue != nodeValue){ifReturn = false;} | |
}); | |
if(ifReturn){ | |
returnRules.push(ruleNode); | |
} | |
}else{ | |
returnRules.push(ruleNode); | |
} | |
}); | |
} | |
if(ifFirst && returnRules.length>0){ | |
return returnRules[0]; | |
}else{ | |
return returnRules; | |
} | |
} | |
function HaiWaiCalculateClean(ac){ | |
var startTime = new Date(); | |
var loadingMessage = "正在执行组货取消确认,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
var currentNode = routerStore.locationNode; | |
var weekURL = ac.m_urlParent; | |
printLog("========开始执行时间:"+startTime); | |
var weekNode = getNode(ac,weekURL); | |
var weekHYNode = getNode(ac,weekURL); | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
//1.获取规则表 | |
//var ruleTableNode = searchRuleTable(monthNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
//2.获取目标表 | |
var targetTableNode = searchHyTargetTable(weekNode); | |
printLog("获取规则表,目标表完成"); | |
//3.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().store._allResultUrls; | |
//4. 获取计算所需要的数据,封装到JSON中,便于后续校验和计算 | |
var beginTime = new Date(); | |
var skcsData = getAndGroupSKCDataHW(ac,resultURLs, controlRuleKeys); | |
//4.深度 G表计算组货宽度 | |
//错误信息声明 | |
var errMsg = []; | |
var weekList = targetTableNode.weekTarget; | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
//品类循环 | |
var categoryList = skcsData.categoryKey; | |
Object.keys(categoryList).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
if(weekTargetNode == undefined){ | |
weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
if(weekTargetNode == undefined) { | |
return; | |
} | |
} | |
var monthTargetNode = weekTargetNode.monthTarget; | |
ac.m_writer.changeNode(weekTargetNode.$URL).changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "double", 0)//组货SKC | |
.changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", 0)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "double", 0)//组货深度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", 0);//组货深度平均价 | |
ac.m_writer.execute({ sync: true });//由于要用到月度数据 必须先提交事务 | |
monthTargetNode = ac.m_cache.addNode(monthTargetNode.$URL); | |
if(monthTargetNode.C8_MCM_MonthGroupGoodsDepth != 0) { | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_PlannedAvgPrice", "double", monthTargetNode.C8_MCM_MonthGroupGoodsAmount / monthTargetNode.C8_MCM_MonthGroupGoodsDepth)//组货SKC | |
} | |
}); | |
jp.close(loading); | |
var endTime = new Date(); | |
printLog("========结束执行时间:"+endTime); | |
} | |
//flag用于区分是检核flase 还是确认true force判断是否强制确认 Jarvis | |
function HaiWaiCalculate(ac,flag,force){ | |
var startTime = new Date(); | |
var loadingMessage = "正在执行组货计算,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
var currentNode = routerStore.locationNode; | |
var weekURL = ac.m_urlParent; | |
printLog("========开始执行时间:"+startTime); | |
var weekNode = getNode(ac,weekURL); | |
var weekHYNode = getNode(ac,weekURL); | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var errorMsg = checkRequiredToConfirm(ac, 3); | |
if (errorMsg) { | |
jp.alert(errorMsg); | |
return | |
} | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
//2.获取目标表 | |
var targetTableNode = searchHyTargetTable(weekNode); | |
printLog("获取规则表,目标表完成"); | |
//3.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().store._allResultUrls; | |
//4. 获取计算所需要的数据,封装到JSON中,便于后续校验和计算 | |
var beginTime = new Date(); | |
var skcsData = getAndGroupSKCDataHW(ac,resultURLs, controlRuleKeys); | |
//4.深度 G表计算组货宽度 | |
//错误信息声明 | |
var errMsg = []; | |
var GList = ruleTableNode.G; | |
var FList = ruleTableNode.F; | |
var weekList = targetTableNode.weekTarget; | |
var zhPrice = 0; | |
var zhVolumn = 0; | |
var skcs = 0; | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
var lookProducts = weekHYNode.LookProducts; | |
var mcNode = monthNode; | |
var groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
var allskc = 0; | |
for(var i=0;i<lookProducts.length;i++){ | |
var mcProductNode = getNode(ac,lookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, mcProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 2); | |
var allDepth = 0; | |
var storeVolumnMap = new Map(Object.entries(mcProductNode.C8_MCP_AdjustingDepthHy)); | |
for (const [volumnkey, value] of storeVolumnMap) { | |
if(key == volumnkey && value != 0){ | |
allskc = allskc + 1; | |
} | |
allDepth = allDepth + value; //统计SKC下深度 不根据店群区分 | |
} | |
ac.m_writer.changeNode(mcProductNode.C8_MCP_SKC).changeAttribute("C8_CW_HWChangeTag","boolean",false); | |
//统计组货深度 | |
ac.m_writer.changeNode(mcProductNode.C8_MCP_SKC).changeAttribute("C8_CW_HWDepth","integer",allDepth); | |
ac.m_writer.changeNode(mcProductNode.$URL).changeAttribute("C8_MCP_AdjustingDepth","integer",allDepth);//调整深度 | |
ac.m_writer.changeNode(mcProductNode.$URL).changeAttribute("C8_MCP_SuggestedDepth","integer",allDepth);//建议深度 | |
//20240415 计算组货金额 汇总到国内电商同一字段 | |
if(null != mcProductNode.C8_MCP_AdjustingAmountHy) { | |
var allAmount = 0; | |
var storeAmountMap = new Map(Object.entries(mcProductNode.C8_MCP_AdjustingAmountHy)); | |
for (const [amountkey, value] of storeAmountMap) { | |
allAmount = allAmount + value; //统计SKC下深度 不根据店群区分 | |
} | |
ac.m_writer.changeNode(mcProductNode.$URL).changeAttribute("C8_MCP_SuggestedAmount", "double", allAmount);//建议金额 | |
} | |
} | |
if(orderType && (orderType==="E" || orderType==="F" || orderType==="T")){ | |
//将结果写入SKC上,海外组货深度,组货单号 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
if(categorySKCList != undefined) { | |
categorySKCList.forEach(function (skcId) { | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId) | |
// .changeAttribute("C8_CW_HWDepth", "integer", skcNode.finalQty) | |
.changeAttribute("C8_CW_HWPick", "boolean", true) | |
.changeAttribute("UR_CW_GroupBillNo", "ref", weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
// if(orderType == "N"){//计划单 | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
// }else{ | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
// } | |
//0521 不分渠道 都取UR_Colorway_PLMUniqueValue | |
var urSkcNode = getNode(ac, skcId); | |
if (urSkcNode.UR_Colorway_OKCode == "") { | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode", "UR_Colorway_PLMUniqueValue", true); | |
} | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,urSkcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, true); | |
}); | |
} | |
}); | |
if(flag){ | |
//如果是应急单,则组货确认时,不做检查,等同于强制确认 | |
jp.alert("海外组货确认完成!"); | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete"); | |
}else{ | |
jp.alert("海外组货检核完成!"); | |
} | |
if (ac.widget.viewParent.getChildView("C8_HWWeekTargets") != undefined) { | |
ac.widget.viewParent.getChildView("C8_HWWeekTargets").refreshData(); | |
} | |
// var LookProducts = weekNode.LookProducts; | |
// var mcNode = getNode(ac, weekNode.__Parent__); | |
// var groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
// for (var i = 0; i < LookProducts.length; i++) { | |
// var lookProductNode = getNode(ac, LookProducts[i]); | |
// updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 2); | |
// } | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag", "boolean", "true"); | |
ac.m_writer.changeNode(weekNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag", "boolean", "true"); | |
ac.widget.refreshData(); | |
return true; | |
} | |
//F表 匹配 | |
if(FList == undefined){ | |
jp.alert("在月度单号占比表没找到对应的数据,请检查!"); | |
return; | |
} | |
if(GList == undefined){ | |
jp.alert("在组货金额,宽度,平均单价,平均深度检核参数表没找到对应的数据,请检查!"); | |
return; | |
} | |
//品类循环 先清空之前的数据 | |
var categoryList = skcsData.categoryKey; | |
Object.keys(categoryList).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
if(weekTargetNode == undefined){ | |
weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
if(weekTargetNode == undefined) { | |
return; | |
} | |
} | |
var monthTargetNode = weekTargetNode.monthTarget; | |
ac.m_writer.changeNode(weekTargetNode.$URL).changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "double", 0)//组货SKC | |
.changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", 0)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "double", 0)//组货深度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", 0);//组货深度平均价 | |
ac.m_writer.execute({ sync: true });//由于要用到月度数据 必须先提交事务 | |
monthTargetNode = ac.m_cache.addNode(monthTargetNode.$URL); | |
if(monthTargetNode.C8_MCM_MonthGroupGoodsDepth != 0) { | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_PlannedAvgPrice", "double", monthTargetNode.C8_MCM_MonthGroupGoodsAmount / monthTargetNode.C8_MCM_MonthGroupGoodsDepth)//组货SKC | |
} | |
}); | |
//获取最低深度并且判断 | |
for(var i=0;i<resultURLs.length;i++){ | |
var mcProductNode = getNode(ac,resultURLs[i]); | |
var lowDepthHy = mcProductNode.C8_MCP_SpecialLowDepthHy; | |
var adDepthHyMap = new Map(Object.entries(mcProductNode.C8_MCP_AdjustingDepthHy)); | |
for (const [key, value] of adDepthHyMap) { | |
if(lowDepthHy[key] != undefined){ | |
if(value > lowDepthHy[key]){ | |
printLog("调整深度大于最低深度,验证通过!"); | |
}else{ | |
var customerNode = getNode(ac,key); | |
errMsg.push("店群为:【" + customerNode.$Name + "】的调整深度小于最低深度,请调整!"); | |
} | |
} | |
} | |
} | |
//用于记录已循环过的品类 其中G表一定要有该数据 | |
var typeList = []; | |
var isLastOrder = weekHYNode.UR_ML_IsLastOrder;//是否月末单号 | |
var skcsList = skcsData.skcIds; | |
// if(skcsList.length == 0){ | |
// jp.alert("此单号下没有SKC,不能进行检核!"); | |
// return true; | |
// } | |
skcsList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
if(Object.keys(skcNode.store).length == 0){ | |
errMsg.push("SKC为:" + skcNode.skcCode + "的店铺没有维护产品等级信息!不能进行检核!"); | |
return; | |
} | |
var catFlag = typeList.includes(skcNode.catId); | |
var midFlag = typeList.includes(skcNode.catId+skcNode.midCatId); | |
if(catFlag || midFlag){ | |
printLog("与"+ skcNode.skcCode + "相同的品类或者品类+中品类的数据已计算,不再重复计算!") | |
return; | |
} | |
var series = skcNode.originalSeries; | |
// var mtquery = new Search(); | |
// var mq = mtquery.getQuery(); | |
// mq.Node(xml.PROP_TYPE, xml.OP_EQUALS, "StyleAttributes") | |
// .Attr("Code", xml.OP_EQUALS, skcNode.styleId, "Child:__Parent__"); | |
// var resmt = mtquery.execute({sync: true}); | |
// var mtResults = resmt.getResultNodes(); | |
// if (mtResults.length > 0) { | |
// series = mtResults[0].UR_StyleAttributes_OriginalSeries; | |
// } | |
Object.keys(skcNode.store).forEach(function(key) { | |
var weekGroupGoodsAmountFinish = 0; | |
var weekGroupGoodsDepthFinish = 0; | |
//,UR_SDS_MiddleCategoryType:skcNode.midCatId 中品类过滤取消 20240321 | |
var tableRuleTG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:组货宽度"}); | |
if(tableRuleTG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleTG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:组货宽度"}); | |
if(tableRuleTG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【组货宽度】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
}else{ | |
if(!typeList.includes(skcNode.catId)){ | |
typeList.push(skcNode.catId); | |
} | |
} | |
}else{ | |
if(!typeList.includes(skcNode.catId+skcNode.midCatId)){ | |
typeList.push(skcNode.catId+skcNode.midCatId); | |
} | |
} | |
var allskcs = 0; | |
var customerNode = getNode(ac,tableRuleTG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleTG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleTG.UR_SDS_MiddleCategoryType) +"】"; | |
if(getEnumValue(tableRuleTG.UR_SDS_Dimension) == "组货宽度"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(mTarget == undefined || weekNode == undefined){ //有可能目标表没有数据,SKC有了 | |
return; | |
} | |
if(getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
var gdskc = mTarget.C8_MCM_PlannedSKC; | |
var allSku = mTarget.C8_MCM_MonthGroupGoodsSKC;//组货SKC | |
var skcs = skcsData.categoryKey[skcNode.categoryKey+key].skcs;//实际SKC | |
allskcs = skcs + mTarget.C8_MCM_MonthGroupGoodsSKC; //加上月已组 | |
if(weekNode == undefined){//可能存在目标表没有店群 跳过循环 | |
return ; | |
} | |
//获取规则表的上下限 | |
var minskcs = parseFloat((gdskc * tableRuleTG.UR_SDS_MonthLowerRate).toFixed(2)); | |
var maxskcs = parseFloat((gdskc * tableRuleTG.UR_SDS_MonthUpperRate).toFixed(2)); | |
if(isLastOrder) { | |
if (minskcs <= allskcs && allskcs <= maxskcs) { | |
console.log(typeKey + "的skc条件满足"); | |
} else { | |
var arr =tsName + "的实际SKC数为:" + allskcs + ",SKC数下限为:" + minskcs + ",SKC数上限为:" + maxskcs + "因此不满足SKC数要求,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(skcs <= maxskcs){ | |
console.log(typeKey + "的skc条件满足"); | |
}else{ | |
var arr =tsName + "的实际SKC数为:" + allskcs + ",SKC数上限为:" + maxskcs + "因此不满足SKC数要求,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",skcs); | |
ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsSKC","integer",allskcs); | |
//ac.m_writer.execute({sync: true});//后面计算需要用到SKC数 (提交事务的值,可以暂存起来后面用) | |
} | |
var tableRuleJG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:组货金额"}); | |
if(tableRuleJG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleJG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:组货金额"}); | |
if(tableRuleJG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【组货金额】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
} | |
var allzhPrice = 0; //整月的实际企划金额 | |
var allzhVolumn = 0;//整夜的实际企划宽度 | |
var customerNode = getNode(ac,tableRuleJG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleJG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleJG.UR_SDS_MiddleCategoryType) +"】"; | |
//企划金额 深度统计 | |
if(getEnumValue(tableRuleJG.UR_SDS_Dimension) == "组货金额"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
if(weekNode == undefined){//可能存在目标表没有店群 跳过循环 | |
return ; | |
} | |
var typeKey = skcNode.commodityTypeKey+getEnumValue(tableRuleJG.UR_SDS_ProductLargeType)+getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType); | |
var storeKey = typeKey+tableRuleJG.UR_SDS_Customer; | |
if(skcsData.categoryKey.hasOwnProperty(typeKey) ) { //&& getEnumValue(GNode.UR_SDS_Dimension)=="组货宽度" | |
var jMap = new Map();//记录相同品类的深度 以及 金额 | |
var hylist = skcsData.categoryKey[typeKey].hylist; | |
hylist.forEach(function (map) { | |
for (var k = 0; k < map.length; k++) { | |
var resMap = map[k]; | |
//金额 | |
var price = resMap.get(storeKey+"price"); | |
if(price != undefined){ | |
if(jMap.has(storeKey+"price")){ | |
jMap.set(storeKey+"price",jMap.get(storeKey+"price")+price); | |
}else{ | |
jMap.set(storeKey+"price",price); | |
} | |
} | |
//宽度 | |
var volumn = resMap.get(storeKey+"volumn"); | |
if(volumn != undefined){ | |
if(jMap.has(storeKey+"volumn")){ | |
jMap.set(storeKey+"volumn",jMap.get(storeKey+"volumn")+volumn); | |
}else{ | |
jMap.set(storeKey+"volumn",volumn); | |
} | |
} | |
} | |
}) | |
//拿到金额后 判断上下限 | |
console.log(jMap.toString()); | |
zhPrice = jMap.get(storeKey+"price"); | |
zhVolumn = jMap.get(storeKey+"volumn"); | |
//查询其他单号里面的金额获取到最终月金额 | |
// 0607(月度下面有mcmc对象的值) | |
// var search = new Search(); | |
// var q = search.getQuery(); | |
// q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
// .RefAttr("C8_MCM_Store", xml.OP_EQUALS, tableRuleJG.UR_SDS_Customer,"Child:__Parent__") | |
// .Attr("C8_MCM_CommodityType", xml.OP_EQUALS, skcNode.commodityType,"Child:__Parent__") | |
// .Attr("C8_MCM_ProductLargeType", xml.OP_EQUALS, tableRuleJG.UR_SDS_ProductLargeType,"Child:__Parent__") | |
// .RefAttr("__Parent__", xml.OP_EQUALS,mTarget.$URL); | |
// if(getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) != ""){ | |
// q.Attr("C8_MCM_CategoryInPlan", xml.OP_EQUALS, tableRuleJG.UR_SDS_MiddleCategoryType,"Child:__Parent__"); | |
// } | |
// var res = search.execute({sync: true}); | |
// var results = res.getResultNodes(); | |
var mcmUrl = mTarget.Colors; | |
for(var j=0;j<mcmUrl.length;j++){ | |
if(weekNode.$URL == mcmUrl[j]){ | |
allzhPrice = allzhPrice + zhPrice; | |
allzhVolumn = allzhVolumn + zhVolumn; | |
}else{ | |
var mcmcNode = getNode(ac,mcmUrl[j]); | |
allzhPrice = allzhPrice + mcmcNode.C8_MCMC_GroupGoodsAmountFinish; | |
allzhVolumn = allzhVolumn + mcmcNode.C8_MCMC_GroupGoodsDepthFinish; | |
} | |
} | |
if(zhPrice != undefined){ | |
//企划金额上下限 | |
var mount = mTarget.C8_MCM_PlannedAmount;//目标企划金额 | |
var minPrice = mount * tableRuleJG.UR_SDS_MonthLowerRate; | |
var maxPrice = mount * tableRuleJG.UR_SDS_MonthUpperRate; | |
//获取目标表数据比较 | |
if(typeKey + tableRuleJG.UR_SDS_Customer == storeKey) { | |
if(isLastOrder) { | |
//判断上下限 金额 | |
if (minPrice <= allzhPrice && allzhPrice <= maxPrice) { | |
console.log("企划金额满足条件!"); | |
} else { | |
var arr = tsName + "的实际企划金额为:" + allzhPrice + "下限企划金额为:" + minPrice + "上限企划金额为:" + maxPrice + ",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(allzhPrice <= maxPrice){ | |
console.log(typeKey + "企划金额满足条件"); | |
}else{ | |
var arr = tsName + "的实际企划金额为:" + allzhPrice + "上限企划金额为:" + maxPrice + ",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", zhPrice); | |
weekGroupGoodsAmountFinish = zhPrice;//组货金额 | |
ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAmount", "double", allzhPrice); | |
}else{ | |
jp.alert("调整企划金额不存在,请检查数据!"); | |
return; | |
} | |
if(zhVolumn != undefined){ | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsDepthFinish","double",zhVolumn); | |
weekGroupGoodsDepthFinish = zhVolumn; | |
ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsDepth", "double", allzhVolumn); | |
//0607修改 注釋 提交事務 | |
//ac.m_writer.execute({sync: true}); | |
} | |
} | |
} | |
var tableRuleSG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:平均深度"}); | |
if(tableRuleSG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleSG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:平均深度"}); | |
if(tableRuleSG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【平均深度】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
} | |
var customerNode = getNode(ac,tableRuleSG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleSG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleSG.UR_SDS_MiddleCategoryType) +"】"; | |
//企划金额 深度统计 | |
if(getEnumValue(tableRuleSG.UR_SDS_Dimension) == "平均深度"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleSG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleSG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(getEnumValue(tableRuleSG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
//深度在前面提交了,可以直接取值 | |
//var avgDepth = weekNode.C8_MCMC_GroupGoodsDepthFinish / weekNode.C8_MCMC_GroupGoodsSKCFinish; | |
var avgDeth = 0;//实际深度 | |
if((mTarget.C8_MCM_MonthGroupGoodsSKC + weekNode.C8_MCMC_GroupGoodsSKCFinish) != 0){ | |
var avgDeth = (allzhVolumn + weekNode.C8_MCMC_GroupGoodsDepthFinish)/(allskcs + weekNode.C8_MCMC_GroupGoodsSKCFinish);//实际 | |
avgDeth = avgDeth.toFixed(2); | |
} | |
//得到平均上下限 | |
var weekavgDeth = mTarget.C8_MCM_PlannedDepth; //企划平均深度 | |
var minavgDeth = weekavgDeth * tableRuleSG.UR_SDS_MonthLowerRate; | |
var maxavgDeth = weekavgDeth * tableRuleSG.UR_SDS_MonthUpperRate; | |
if(typeKey + tableRuleSG.UR_SDS_Customer == storeKey){ | |
//判断上下限 深度 | |
if(isLastOrder){ | |
if(minavgDeth <= avgDeth && avgDeth <= maxavgDeth){ | |
console.log("平均深度满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均深度为:"+avgDeth+"下限平均深度为:"+minavgDeth.toFixed(2)+"上限平均深度为:"+maxavgDeth.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(avgDeth <= maxavgDeth){ | |
console.log("平均深度满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均深度为:"+avgDeth+"上限平均深度为:"+maxavgDeth.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
} | |
} | |
var tableRuleDG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:平均单价"}); | |
if(tableRuleDG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleDG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:平均单价"}); | |
if(tableRuleDG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【平均单价】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
} | |
var customerNode = getNode(ac,tableRuleDG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleDG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleDG.UR_SDS_MiddleCategoryType) +"】"; | |
//企划金额 深度统计 | |
if(getEnumValue(tableRuleDG.UR_SDS_Dimension) == "平均单价"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleDG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleDG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(getEnumValue(tableRuleDG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
if(weekNode == undefined){//可能存在目标表没有店群 跳过循环 | |
return ; | |
} | |
var avgPrice = 0; | |
if(weekGroupGoodsDepthFinish != 0){ | |
avgPrice = weekGroupGoodsAmountFinish / weekGroupGoodsDepthFinish; | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",avgPrice); | |
// var colors = mTarget.Colors;//月下所有的单号 | |
// colors.forEach(function(weekUrl){ | |
// if(weekUrl != weekNode.$URL){ | |
// var oldWeekNode = getNode(ac,weekUrl); | |
// isLastOrder = oldWeekNode.UR_ML_IsLastOrder; | |
// } | |
// }); | |
//var avgPrice = mTarget.C8_MCM_MonthGroupGoodsAmount / mTarget.C8_MCM_MonthGroupGoodsDepth; 20240320取消原逻辑 | |
var avgPrice = (mTarget.C8_MCM_MonthGroupGoodsAmount + weekNode.C8_MCMC_GroupGoodsAmountFinish) / (mTarget.C8_MCM_MonthGroupGoodsDepth+weekNode.C8_MCMC_GroupGoodsDepthFinish); | |
avgPrice = avgPrice.toFixed(2); | |
//得到平均单价上下限 | |
var weekavgPrice = mTarget.C8_MCM_PlannedAvgPrice;//平均单价 | |
var minavgPrice = weekavgPrice * tableRuleDG.UR_SDS_MonthLowerRate; | |
var maxavgPrice = weekavgPrice * tableRuleDG.UR_SDS_MonthUpperRate; | |
if(typeKey + tableRuleJG.UR_SDS_Customer == storeKey){ | |
//判断上下限 平均单价 | |
if(isLastOrder){ | |
if(minavgPrice <= avgPrice && avgPrice <= maxavgPrice){ | |
console.log("平均单价满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均单价为:"+avgPrice+"下限平均单价为:"+minavgPrice.toFixed(2)+"上限平均单价为:"+maxavgPrice.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(weekavgPrice <= maxavgPrice){ | |
console.log("平均单价满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均单价为:"+avgPrice+"上限平均单价为:"+maxavgPrice.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
} | |
//平均单价 调整金额的和/SKC个数和/海外调整深度和 | |
var weekavgPrice = 0; | |
if(weekNode.C8_MCMC_GroupGoodsDepthFinish != 0){ | |
var weekavgPrice = weekNode.C8_MCMC_GroupGoodsAmountFinish /weekNode.C8_MCMC_GroupGoodsDepthFinish; | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",weekavgPrice); | |
//ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAvgPrice","double",avgPrice); | |
} | |
var tableRuleF = filterRuleTable(ruleTableNode, "F", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_SubProductSeriation: series, | |
UR_SDS_Customer: key,UR_SDS_BillNo:weekHYNode.C8_ML_Week}); | |
if(tableRuleF.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询月度单号占比表中未在配置表查到相应数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
var customerNode = getNode(ac,tableRuleF.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(weekHYNode.C8_ML_Week)+ "】"; | |
if(tableRuleF.UR_SDS_TableRule == "UR_Rule:F"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
var lower = tableRuleF.UR_SDS_SKCLower;//F表中下限 | |
var upper = tableRuleF.UR_SDS_SKCUpper;//F表中上限 | |
if(lower <= allskc && allskc <= upper){ | |
printLog(tsName + "的SKC数满足月度单号占比上下限值!"); | |
}else{ | |
var arr = tsName + "总SKC数为:" + allskc + ",月度单号占比表下限为:"+lower+",月度单号占比表上限为:" + upper +",不满足条件,请检查!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
/*var tableRuleD = filterRuleTable(ruleTableNode, "D", true, { | |
UR_SDS_ProductLargeType: skcNode.catId, UR_SDS_SubProductSeriation: monthNode.C8_MC_Series}); | |
if(tableRuleD.length == 0){ | |
return; | |
} | |
var customerNode = getNode(ac,key); | |
var tsName = "【" + skcNode.skcCode+ "】【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(skcNode.catId)+ "】【" + locale.getEnumName(skcNode.midCatId) +"】"; | |
if(tableRuleD.UR_SDS_TableRule == "UR_Rule:D"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId)+ key;//商品层+品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId)+ key;//商品层+品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
var typeKey = skcNode.commodityTypeKey+getEnumValue(tableRuleD.UR_SDS_ProductLargeType)+getEnumValue(tableRuleD.UR_SDS_MiddleCategoryType); | |
var storeKey = typeKey+tableRuleD.UR_SDS_Customer; | |
var lowDepth = tableRuleD.UR_SDS_LowDepth;//规则表中最低深度 | |
var styleDepthFinish = weekNode.C8_MCMC_GroupGoodsStyleDepthFinish; //款深度 目标最低深度 | |
if(typeKey + tableRuleD.UR_SDS_Customer == storeKey) { | |
if(styleDepthFinish < lowDepth){ | |
errMsg.push(tsName + "的目标最低深度低于规则表最低深度,因此不满足条件,请调整!") | |
}else{ | |
console.log("最低深度满足条件!"); | |
} | |
} | |
}*/ | |
}); | |
}); | |
jp.close(loading); | |
var endTime = new Date(); | |
printLog("========结束执行时间:"+endTime); | |
if(errMsg.length == 0 || force || !isLastOrder){ | |
//jp.alert("海外组货确认完成!"); | |
//将结果写入SKC上,国内组货深度,组货单号 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
if(categorySKCList != undefined) { | |
categorySKCList.forEach(function (skcId) { | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId) | |
//.changeAttribute("C8_CW_HWDepth", "integer", skcNode.finalQty) | |
.changeAttribute("C8_CW_HWPick", "boolean", true) | |
.changeAttribute("UR_CW_GroupBillNo", "ref", weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
// if(orderType == "N"){//计划单 | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
// }else{ | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
// } | |
//0521 不分渠道 都取UR_Colorway_PLMUniqueValue | |
var urSkcNode = getNode(ac, skcId); | |
if (urSkcNode.UR_Colorway_OKCode == "") { | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode", "UR_Colorway_PLMUniqueValue", true); | |
} | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,urSkcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, true); | |
}); | |
} | |
}); | |
if(flag) { | |
var LookProducts = weekNode.LookProducts; | |
var mcNode = getNode(ac, weekNode.__Parent__); | |
var groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 2); | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status", "enum", "UR_ZHStatus:Complete"); | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag", "boolean", "true"); | |
ac.m_writer.changeNode(weekNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag", "boolean", "true"); | |
}else{ | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status", "enum", "UR_ZHStatus:Lock"); | |
} | |
//区分检核还是确认 | |
if(flag){ | |
jp.alert("海外组货确认完成!"); | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete"); | |
}else{ | |
jp.alert("海外组货检核完成!"); | |
} | |
//海外组货深度逻辑在前面 | |
//var skcsList = skcsData.list; | |
// skcsData.skcIds.forEach(function(skcId){ | |
// var skcNode = skcsList[skcId]; | |
// ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_HWDepth","integer",skcNode.finalQty); | |
// ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_HWChangeTag","boolean",false); | |
// }); | |
//将结果写入SKC上,电商组货深度 | |
//ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete"); | |
var mentions = getGroup(ac, "电商买手"); | |
var subject = "组货确认消息";//主题 | |
var comments = monthNode.$Name + "的" + weekNode.$Name + "组货已确认";//消息文本 | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
//SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
}else{ | |
jp.alert(errMsg.join("</BR>")); | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
} | |
if (ac.widget.viewParent.getChildView("C8_HWWeekTargets") != undefined) { | |
ac.widget.viewParent.getChildView("C8_HWWeekTargets").refreshData(); | |
} | |
//Agnes 更新弱管控品类目标 | |
Object.keys(targetTableNode.weakWeekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
var weekSKCUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//周 可超宽度剩余C8_MCMC_ExcessSKCRemaining | |
var weekSKCDepthTarget = weekSKCTarget+weekSKCUpperTarget; | |
if(skcsData.weakCategoryKey[key]&& weekSKCDepthTarget>0) { | |
var catKeyNode = skcsData.weakCategoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish", "double", finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "integer", skcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish", "integer", styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "integer", finalQty);//组货深度 | |
} | |
}); | |
if (ac.widget.viewParent.getChildView("C8_MCMaterialsHW") != undefined) { | |
ac.widget.viewParent.getChildView("C8_MCMaterialsHW").refreshData(); | |
} | |
ac.widget.refreshData(); | |
return true; | |
} | |
//flag用于区分是检核flase 还是确认true force判断是否强制确认 Jarvis 欧美组货 | |
function HaiWaiCalculateOM(ac,flag,force){ | |
var startTime = new Date(); | |
var loadingMessage = "正在执行组货计算,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
var currentNode = routerStore.locationNode; | |
var weekURL = ac.m_urlParent; | |
printLog("========开始执行时间:"+startTime); | |
var weekNode = getNode(ac,weekURL); | |
var weekHYNode = getNode(ac,weekURL); | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var errorMsg = checkRequiredToConfirm(ac, 3); | |
if (errorMsg) { | |
jp.alert(errorMsg); | |
return | |
} | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
//2.获取目标表 | |
var targetTableNode = searchHyTargetTable(weekNode); | |
printLog("获取规则表,目标表完成"); | |
//3.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().store._allResultUrls; | |
//4. 获取计算所需要的数据,封装到JSON中,便于后续校验和计算 | |
var beginTime = new Date(); | |
var skcsData = getAndGroupSKCDataHW(ac,resultURLs, controlRuleKeys); | |
//4.深度 G表计算组货宽度 | |
//错误信息声明 | |
var errMsg = []; | |
var GList = ruleTableNode.G; | |
var FList = ruleTableNode.F; | |
var weekList = targetTableNode.weekTarget; | |
var zhPrice = 0; | |
var zhVolumn = 0; | |
var skcs = 0; | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
var lookProducts = weekHYNode.LookProducts; | |
var mcNode = monthNode; | |
var groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
var allskc = 0; | |
for(var i=0;i<lookProducts.length;i++){ | |
var mcProductNode = getNode(ac,lookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, mcProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 2); | |
var allDepth = 0; | |
var storeVolumnMap = new Map(Object.entries(mcProductNode.C8_MCP_AdjustingDepthHy)); | |
for (const [volumnkey, value] of storeVolumnMap) { | |
if(key == volumnkey && value != 0){ | |
allskc = allskc + 1; | |
} | |
allDepth = allDepth + value; //统计SKC下深度 不根据店群区分 | |
} | |
ac.m_writer.changeNode(mcProductNode.C8_MCP_SKC).changeAttribute("C8_CW_HWChangeTag","boolean",false); | |
//统计组货深度 | |
ac.m_writer.changeNode(mcProductNode.C8_MCP_SKC).changeAttribute("C8_CW_HWDepth","integer",allDepth); | |
ac.m_writer.changeNode(mcProductNode.$URL).changeAttribute("C8_MCP_AdjustingDepth","integer",allDepth);//调整深度 | |
ac.m_writer.changeNode(mcProductNode.$URL).changeAttribute("C8_MCP_SuggestedDepth","integer",allDepth);//建议深度 | |
//20240415 计算组货金额 汇总到国内电商同一字段 | |
if(null != mcProductNode.C8_MCP_AdjustingAmountHy) { | |
var allAmount = 0; | |
var storeAmountMap = new Map(Object.entries(mcProductNode.C8_MCP_AdjustingAmountHy)); | |
for (const [amountkey, value] of storeAmountMap) { | |
allAmount = allAmount + value; //统计SKC下深度 不根据店群区分 | |
} | |
ac.m_writer.changeNode(mcProductNode.$URL).changeAttribute("C8_MCP_SuggestedAmount", "double", allAmount);//建议金额 | |
} | |
} | |
if(orderType && (orderType==="E" || orderType==="F" || orderType==="T")){ | |
//将结果写入SKC上,海外组货深度,组货单号 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
if(categorySKCList != undefined) { | |
categorySKCList.forEach(function (skcId) { | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId) | |
// .changeAttribute("C8_CW_HWDepth", "integer", skcNode.finalQty) | |
.changeAttribute("C8_CW_HWPick", "boolean", true) | |
.changeAttribute("UR_CW_GroupBillNo", "ref", weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
// if(orderType == "N"){//计划单 | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
// }else{ | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
// } | |
//0521 不分渠道 都取UR_Colorway_PLMUniqueValue | |
var urSkcNode = getNode(ac, skcId); | |
if (urSkcNode.UR_Colorway_OKCode == "") { | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode", "UR_Colorway_PLMUniqueValue", true); | |
} | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,urSkcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, true); | |
}); | |
} | |
}); | |
if(flag){ | |
//如果是应急单,则组货确认时,不做检查,等同于强制确认 | |
jp.alert("海外组货确认完成!"); | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete"); | |
}else{ | |
jp.alert("海外组货检核完成!"); | |
} | |
if (ac.widget.viewParent.getChildView("C8_HWWeekTargets") != undefined) { | |
ac.widget.viewParent.getChildView("C8_HWWeekTargets").refreshData(); | |
} | |
// var LookProducts = weekNode.LookProducts; | |
// var mcNode = getNode(ac, weekNode.__Parent__); | |
// var groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
// for (var i = 0; i < LookProducts.length; i++) { | |
// var lookProductNode = getNode(ac, LookProducts[i]); | |
// updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 2); | |
// } | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag", "boolean", "true"); | |
ac.m_writer.changeNode(weekNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag", "boolean", "true"); | |
ac.widget.refreshData(); | |
return true; | |
} | |
//F表 匹配 | |
if(FList == undefined){ | |
jp.alert("在月度单号占比表没找到对应的数据,请检查!"); | |
return; | |
} | |
if(GList == undefined){ | |
jp.alert("在组货金额,宽度,平均单价,平均深度检核参数表没找到对应的数据,请检查!"); | |
return; | |
} | |
//品类循环 先清空之前的数据 | |
var categoryList = skcsData.categoryKey; | |
Object.keys(categoryList).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
if(weekTargetNode == undefined){ | |
weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
if(weekTargetNode == undefined) { | |
return; | |
} | |
} | |
var monthTargetNode = weekTargetNode.monthTarget; | |
ac.m_writer.changeNode(weekTargetNode.$URL).changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "double", 0)//组货SKC | |
.changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", 0)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "double", 0)//组货深度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", 0);//组货深度平均价 | |
ac.m_writer.execute({ sync: true });//由于要用到月度数据 必须先提交事务 | |
monthTargetNode = ac.m_cache.addNode(monthTargetNode.$URL); | |
if(monthTargetNode.C8_MCM_MonthGroupGoodsDepth != 0) { | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_PlannedAvgPrice", "double", monthTargetNode.C8_MCM_MonthGroupGoodsAmount / monthTargetNode.C8_MCM_MonthGroupGoodsDepth)//组货SKC | |
} | |
}); | |
//获取最低深度并且判断 | |
for(var i=0;i<resultURLs.length;i++){ | |
var mcProductNode = getNode(ac,resultURLs[i]); | |
var lowDepthHy = mcProductNode.C8_MCP_SpecialLowDepthHy; | |
var adDepthHyMap = new Map(Object.entries(mcProductNode.C8_MCP_AdjustingDepthHy)); | |
for (const [key, value] of adDepthHyMap) { | |
if(lowDepthHy[key] != undefined){ | |
if(value > lowDepthHy[key]){ | |
printLog("调整深度大于最低深度,验证通过!"); | |
}else{ | |
var customerNode = getNode(ac,key); | |
errMsg.push("店群为:【" + customerNode.$Name + "】的调整深度小于最低深度,请调整!"); | |
} | |
} | |
} | |
} | |
//用于记录已循环过的品类 其中G表一定要有该数据 | |
var typeList = []; | |
var isLastOrder = weekHYNode.UR_ML_IsLastOrder;//是否月末单号 | |
var skcsList = skcsData.skcIds; | |
// if(skcsList.length == 0){ | |
// jp.alert("此单号下没有SKC,不能进行检核!"); | |
// return true; | |
// } | |
skcsList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
if(Object.keys(skcNode.store).length == 0){ | |
errMsg.push("SKC为:" + skcNode.skcCode + "的店铺没有维护产品等级信息!不能进行检核!"); | |
return; | |
} | |
var catFlag = typeList.includes(skcNode.catId); | |
var midFlag = typeList.includes(skcNode.catId+skcNode.midCatId); | |
if(catFlag || midFlag){ | |
printLog("与"+ skcNode.skcCode + "相同的品类或者品类+中品类的数据已计算,不再重复计算!") | |
return; | |
} | |
var series = skcNode.originalSeries; | |
// var mtquery = new Search(); | |
// var mq = mtquery.getQuery(); | |
// mq.Node(xml.PROP_TYPE, xml.OP_EQUALS, "StyleAttributes") | |
// .Attr("Code", xml.OP_EQUALS, skcNode.styleId, "Child:__Parent__"); | |
// var resmt = mtquery.execute({sync: true}); | |
// var mtResults = resmt.getResultNodes(); | |
// if (mtResults.length > 0) { | |
// series = mtResults[0].UR_StyleAttributes_OriginalSeries; | |
// } | |
Object.keys(skcNode.store).forEach(function(key) { | |
var weekGroupGoodsAmountFinish = 0; | |
var weekGroupGoodsDepthFinish = 0; | |
//,UR_SDS_MiddleCategoryType:skcNode.midCatId 中品类过滤取消 20240321 | |
var tableRuleTG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:组货宽度"}); | |
if(tableRuleTG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleTG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:组货宽度"}); | |
if(tableRuleTG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【组货宽度】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
}else{ | |
if(!typeList.includes(skcNode.catId)){ | |
typeList.push(skcNode.catId); | |
} | |
} | |
}else{ | |
if(!typeList.includes(skcNode.catId+skcNode.midCatId)){ | |
typeList.push(skcNode.catId+skcNode.midCatId); | |
} | |
} | |
var customerNode = getNode(ac,tableRuleTG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleTG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleTG.UR_SDS_MiddleCategoryType) +"】"; | |
if(getEnumValue(tableRuleTG.UR_SDS_Dimension) == "组货宽度"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(mTarget == undefined || weekNode == undefined){ //有可能目标表没有数据,SKC有了 | |
return; | |
} | |
if(getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
var gdskc = mTarget.C8_MCM_PlannedSKC; | |
var allSku = mTarget.C8_MCM_MonthGroupGoodsSKC;//组货SKC | |
var skcs = skcsData.categoryKey[skcNode.categoryKey+key].skcs;//实际SKC | |
var allskcs = skcs + mTarget.C8_MCM_MonthGroupGoodsSKC; //加上月已组 | |
if(weekNode == undefined){//可能存在目标表没有店群 跳过循环 | |
return ; | |
} | |
//获取规则表的上下限 | |
var minskcs = parseFloat((gdskc * tableRuleTG.UR_SDS_MonthLowerRate).toFixed(2)); | |
var maxskcs = parseFloat((gdskc * tableRuleTG.UR_SDS_MonthUpperRate).toFixed(2)); | |
if(isLastOrder) { | |
if (minskcs <= allskcs && allskcs <= maxskcs) { | |
console.log(typeKey + "的skc条件满足"); | |
} else { | |
var arr =tsName + "的实际SKC数为:" + allskcs + ",SKC数下限为:" + minskcs + ",SKC数上限为:" + maxskcs + "因此不满足SKC数要求,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(skcs <= maxskcs){ | |
console.log(typeKey + "的skc条件满足"); | |
}else{ | |
var arr =tsName + "的实际SKC数为:" + allskcs + ",SKC数上限为:" + maxskcs + "因此不满足SKC数要求,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",skcs); | |
ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsSKC","integer",allskcs); | |
//ac.m_writer.execute({sync: true});//后面计算需要用到SKC数 (提交事务的值,可以暂存起来后面用) | |
} | |
var tableRuleJG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:组货金额"}); | |
if(tableRuleJG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleJG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:组货金额"}); | |
if(tableRuleJG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【组货金额】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
} | |
var customerNode = getNode(ac,tableRuleJG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleJG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleJG.UR_SDS_MiddleCategoryType) +"】"; | |
//企划金额 深度统计 | |
if(getEnumValue(tableRuleJG.UR_SDS_Dimension) == "组货金额"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
if(weekNode == undefined){//可能存在目标表没有店群 跳过循环 | |
return ; | |
} | |
var typeKey = skcNode.commodityTypeKey+getEnumValue(tableRuleJG.UR_SDS_ProductLargeType)+getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType); | |
var storeKey = typeKey+tableRuleJG.UR_SDS_Customer; | |
if(skcsData.categoryKey.hasOwnProperty(typeKey) ) { //&& getEnumValue(GNode.UR_SDS_Dimension)=="组货宽度" | |
var jMap = new Map();//记录相同品类的深度 以及 金额 | |
var hylist = skcsData.categoryKey[typeKey].hylist; | |
hylist.forEach(function (map) { | |
for (var k = 0; k < map.length; k++) { | |
var resMap = map[k]; | |
//金额 | |
var price = resMap.get(storeKey+"price"); | |
if(price != undefined){ | |
if(jMap.has(storeKey+"price")){ | |
jMap.set(storeKey+"price",jMap.get(storeKey+"price")+price); | |
}else{ | |
jMap.set(storeKey+"price",price); | |
} | |
} | |
//宽度 | |
var volumn = resMap.get(storeKey+"volumn"); | |
if(volumn != undefined){ | |
if(jMap.has(storeKey+"volumn")){ | |
jMap.set(storeKey+"volumn",jMap.get(storeKey+"volumn")+volumn); | |
}else{ | |
jMap.set(storeKey+"volumn",volumn); | |
} | |
} | |
} | |
}) | |
//拿到金额后 判断上下限 | |
console.log(jMap.toString()); | |
zhPrice = jMap.get(storeKey+"price"); | |
zhVolumn = jMap.get(storeKey+"volumn"); | |
var allzhPrice = 0; //整月的实际企划金额 | |
var allzhVolumn = 0;//整夜的实际企划宽度 | |
//查询其他单号里面的金额获取到最终月金额 | |
// 0607(月度下面有mcmc对象的值) | |
// var search = new Search(); | |
// var q = search.getQuery(); | |
// q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
// .RefAttr("C8_MCM_Store", xml.OP_EQUALS, tableRuleJG.UR_SDS_Customer,"Child:__Parent__") | |
// .Attr("C8_MCM_CommodityType", xml.OP_EQUALS, skcNode.commodityType,"Child:__Parent__") | |
// .Attr("C8_MCM_ProductLargeType", xml.OP_EQUALS, tableRuleJG.UR_SDS_ProductLargeType,"Child:__Parent__") | |
// .RefAttr("__Parent__", xml.OP_EQUALS,mTarget.$URL); | |
// if(getEnumValue(tableRuleJG.UR_SDS_MiddleCategoryType) != ""){ | |
// q.Attr("C8_MCM_CategoryInPlan", xml.OP_EQUALS, tableRuleJG.UR_SDS_MiddleCategoryType,"Child:__Parent__"); | |
// } | |
// var res = search.execute({sync: true}); | |
// var results = res.getResultNodes(); | |
var mcmUrl = mTarget.Colors; | |
for(var j=0;j<mcmUrl.length;j++){ | |
if(weekNode.$URL == mcmUrl[j]){ | |
allzhPrice = allzhPrice + zhPrice; | |
allzhVolumn = allzhVolumn + zhVolumn; | |
}else{ | |
var mcmcNode = getNode(ac,mcmUrl[j]); | |
allzhPrice = allzhPrice + mcmcNode.C8_MCMC_GroupGoodsAmountFinish; | |
allzhVolumn = allzhVolumn + mcmcNode.C8_MCMC_GroupGoodsDepthFinish; | |
} | |
} | |
if(zhPrice != undefined){ | |
//企划金额上下限 | |
var mount = mTarget.C8_MCM_PlannedAmount;//目标企划金额 | |
var minPrice = mount * tableRuleJG.UR_SDS_MonthLowerRate; | |
var maxPrice = mount * tableRuleJG.UR_SDS_MonthUpperRate; | |
//获取目标表数据比较 | |
if(typeKey + tableRuleJG.UR_SDS_Customer == storeKey) { | |
if(isLastOrder) { | |
//判断上下限 金额 | |
if (minPrice <= allzhPrice && allzhPrice <= maxPrice) { | |
console.log("企划金额满足条件!"); | |
} else { | |
var arr = tsName + "的实际企划金额为:" + allzhPrice + "下限企划金额为:" + minPrice + "上限企划金额为:" + maxPrice + ",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(allzhPrice <= maxPrice){ | |
console.log(typeKey + "企划金额满足条件"); | |
}else{ | |
var arr = tsName + "的实际企划金额为:" + allzhPrice + "上限企划金额为:" + maxPrice + ",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", zhPrice); | |
weekGroupGoodsAmountFinish = zhPrice;//组货金额 | |
ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAmount", "double", allzhPrice); | |
}else{ | |
jp.alert("调整企划金额不存在,请检查数据!"); | |
return; | |
} | |
if(zhVolumn != undefined){ | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsDepthFinish","double",zhVolumn); | |
weekGroupGoodsDepthFinish = zhVolumn; | |
ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsDepth", "double", allzhVolumn); | |
//0607修改 注釋 提交事務 | |
//ac.m_writer.execute({sync: true}); | |
} | |
} | |
} | |
var tableRuleSG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:平均深度"}); | |
if(tableRuleSG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleSG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:平均深度"}); | |
if(tableRuleSG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【平均深度】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
} | |
var customerNode = getNode(ac,tableRuleSG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleSG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleSG.UR_SDS_MiddleCategoryType) +"】"; | |
//企划金额 深度统计 | |
if(getEnumValue(tableRuleSG.UR_SDS_Dimension) == "平均深度"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleSG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleSG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(getEnumValue(tableRuleSG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
//深度在前面提交了,可以直接取值 | |
var avgDepth = weekNode.C8_MCMC_GroupGoodsDepthFinish / weekNode.C8_MCMC_GroupGoodsSKCFinish; | |
var avgDeth = 0;//实际深度 | |
if((mTarget.C8_MCM_MonthGroupGoodsSKC + weekNode.C8_MCMC_GroupGoodsSKCFinish) != 0){ | |
var avgDeth = (mTarget.C8_MCM_MonthGroupGoodsDepth + weekNode.C8_MCMC_GroupGoodsDepthFinish)/(mTarget.C8_MCM_MonthGroupGoodsSKC + weekNode.C8_MCMC_GroupGoodsSKCFinish);//实际 | |
avgDeth = avgDeth.toFixed(2); | |
} | |
//得到平均上下限 | |
var weekavgDeth = mTarget.C8_MCM_PlannedDepth; //企划平均深度 | |
var minavgDeth = weekavgDeth * tableRuleSG.UR_SDS_MonthLowerRate; | |
var maxavgDeth = weekavgDeth * tableRuleSG.UR_SDS_MonthUpperRate; | |
if(typeKey + tableRuleSG.UR_SDS_Customer == storeKey){ | |
//判断上下限 深度 | |
if(isLastOrder){ | |
if(minavgDeth <= avgDeth && avgDeth <= maxavgDeth){ | |
console.log("平均深度满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均深度为:"+avgDeth+"下限平均深度为:"+minavgDeth.toFixed(2)+"上限平均深度为:"+maxavgDeth.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(avgDeth <= maxavgDeth){ | |
console.log("平均深度满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均深度为:"+avgDeth+"上限平均深度为:"+maxavgDeth.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
} | |
} | |
var tableRuleDG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_MiddleCategoryType:skcNode.midCatId,UR_SDS_Dimension:"UR_enum_Dimension:平均单价"}); | |
if(tableRuleDG.length == 0){ //如果查询为空,则取消中品类再次查询,如果再为空代表配置表没有数据 Jarvis | |
tableRuleDG = filterRuleTable(ruleTableNode, "G", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_ProductLargeType: skcNode.catId, | |
UR_SDS_SubProductSeriation: series, UR_SDS_Customer: key,UR_SDS_Dimension:"UR_enum_Dimension:平均单价"}); | |
if(tableRuleDG.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询组货金额,宽度,平均单价,平均深度检核参数表中未在配置表查到【平均单价】数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
} | |
var customerNode = getNode(ac,tableRuleDG.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(tableRuleDG.UR_SDS_ProductLargeType)+ "】【" + locale.getEnumName(tableRuleDG.UR_SDS_MiddleCategoryType) +"】"; | |
//企划金额 深度统计 | |
if(getEnumValue(tableRuleDG.UR_SDS_Dimension) == "平均单价"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleDG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleDG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
if(getEnumValue(tableRuleDG.UR_SDS_MiddleCategoryType) != ""){ | |
var mTarget = targetTableNode.weakMonthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weakWeekTarget[weekKeyStr];//周目标 | |
} | |
if(weekNode == undefined){//可能存在目标表没有店群 跳过循环 | |
return ; | |
} | |
var avgPrice = 0; | |
if(weekGroupGoodsDepthFinish != 0){ | |
avgPrice = weekGroupGoodsAmountFinish / weekGroupGoodsDepthFinish; | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",avgPrice); | |
// var colors = mTarget.Colors;//月下所有的单号 | |
// colors.forEach(function(weekUrl){ | |
// if(weekUrl != weekNode.$URL){ | |
// var oldWeekNode = getNode(ac,weekUrl); | |
// isLastOrder = oldWeekNode.UR_ML_IsLastOrder; | |
// } | |
// }); | |
//var avgPrice = mTarget.C8_MCM_MonthGroupGoodsAmount / mTarget.C8_MCM_MonthGroupGoodsDepth; 20240320取消原逻辑 | |
var avgPrice = (mTarget.C8_MCM_MonthGroupGoodsAmount + weekNode.C8_MCMC_GroupGoodsAmountFinish) / (mTarget.C8_MCM_MonthGroupGoodsDepth+weekNode.C8_MCMC_GroupGoodsDepthFinish); | |
avgPrice = avgPrice.toFixed(2); | |
//得到平均单价上下限 | |
var weekavgPrice = mTarget.C8_MCM_PlannedAvgPrice;//平均单价 | |
var minavgPrice = weekavgPrice * tableRuleDG.UR_SDS_MonthLowerRate; | |
var maxavgPrice = weekavgPrice * tableRuleDG.UR_SDS_MonthUpperRate; | |
if(typeKey + tableRuleJG.UR_SDS_Customer == storeKey){ | |
//判断上下限 平均单价 | |
if(isLastOrder){ | |
if(minavgPrice <= avgPrice && avgPrice <= maxavgPrice){ | |
console.log("平均单价满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均单价为:"+avgPrice+"下限平均单价为:"+minavgPrice.toFixed(2)+"上限平均单价为:"+maxavgPrice.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
}else{ | |
if(weekavgPrice <= maxavgPrice){ | |
console.log("平均单价满足条件!"); | |
}else{ | |
var arr = tsName + "的实际平均单价为:"+avgPrice+"上限平均单价为:"+maxavgPrice.toFixed(2)+",因此不满足条件,请调整!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
} | |
//平均单价 调整金额的和/SKC个数和/海外调整深度和 | |
var weekavgPrice = 0; | |
if(weekNode.C8_MCMC_GroupGoodsDepthFinish != 0){ | |
var weekavgPrice = weekNode.C8_MCMC_GroupGoodsAmountFinish /weekNode.C8_MCMC_GroupGoodsDepthFinish; | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",weekavgPrice); | |
//ac.m_writer.changeNode(mTarget.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAvgPrice","double",avgPrice); | |
} | |
var tableRuleF = filterRuleTable(ruleTableNode, "F", true, { | |
UR_SDS_Month: monthNode.C8_MC_Month, UR_SDS_SubProductSeriation: series, | |
UR_SDS_Customer: key,UR_SDS_BillNo:weekHYNode.C8_ML_Week}); | |
if(tableRuleF.length == 0){ | |
// var arr = "【" + skcNode.skcCode+ "】在查询月度单号占比表中未在配置表查到相应数据!"; | |
// if(!errMsg.includes(arr)){ | |
// errMsg.push(arr); | |
// } | |
return; | |
} | |
var customerNode = getNode(ac,tableRuleF.UR_SDS_Customer); | |
var tsName = "【" + customerNode.$Name+ "】【" + locale.getEnumName(weekHYNode.C8_ML_Week)+ "】"; | |
if(tableRuleF.UR_SDS_TableRule == "UR_Rule:F"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId) + getEnumValue(tableRuleTG.UR_SDS_MiddleCategoryType) + key;//商品层+品类+配置表中品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
var lower = tableRuleF.UR_SDS_SKCLower;//F表中下限 | |
var upper = tableRuleF.UR_SDS_SKCUpper;//F表中上限 | |
if(lower <= allskc && allskc <= upper){ | |
printLog(tsName + "的SKC数满足月度单号占比上下限值!"); | |
}else{ | |
var arr = tsName + "总SKC数为:" + allskc + ",月度单号占比表下限为:"+lower+",月度单号占比表上限为:" + upper +",不满足条件,请检查!"; | |
if(!errMsg.includes(arr)){ | |
errMsg.push(arr); | |
} | |
} | |
} | |
/*var tableRuleD = filterRuleTable(ruleTableNode, "D", true, { | |
UR_SDS_ProductLargeType: skcNode.catId, UR_SDS_SubProductSeriation: monthNode.C8_MC_Series}); | |
if(tableRuleD.length == 0){ | |
return; | |
} | |
var customerNode = getNode(ac,key); | |
var tsName = "【" + skcNode.skcCode+ "】【" + customerNode.$Name+ "】【" + locale.getEnumName(skcNode.commodityType) + "】【" + locale.getEnumName(skcNode.catId)+ "】【" + locale.getEnumName(skcNode.midCatId) +"】"; | |
if(tableRuleD.UR_SDS_TableRule == "UR_Rule:D"){ | |
//月目标SKU数 | |
var monthKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId)+ key;//商品层+品类+店铺 | |
var weekKeyStr = skcNode.commodityTypeKey + getEnumValue(skcNode.catId)+ key;//商品层+品类+店铺 | |
var mTarget = targetTableNode.monthTarget[monthKeyStr];//月目标 | |
var weekNode = targetTableNode.weekTarget[weekKeyStr];//周目标 | |
var typeKey = skcNode.commodityTypeKey+getEnumValue(tableRuleD.UR_SDS_ProductLargeType)+getEnumValue(tableRuleD.UR_SDS_MiddleCategoryType); | |
var storeKey = typeKey+tableRuleD.UR_SDS_Customer; | |
var lowDepth = tableRuleD.UR_SDS_LowDepth;//规则表中最低深度 | |
var styleDepthFinish = weekNode.C8_MCMC_GroupGoodsStyleDepthFinish; //款深度 目标最低深度 | |
if(typeKey + tableRuleD.UR_SDS_Customer == storeKey) { | |
if(styleDepthFinish < lowDepth){ | |
errMsg.push(tsName + "的目标最低深度低于规则表最低深度,因此不满足条件,请调整!") | |
}else{ | |
console.log("最低深度满足条件!"); | |
} | |
} | |
}*/ | |
}); | |
}); | |
jp.close(loading); | |
var endTime = new Date(); | |
printLog("========结束执行时间:"+endTime); | |
if(errMsg.length == 0 || force || !isLastOrder){ | |
//jp.alert("海外组货确认完成!"); | |
//将结果写入SKC上,国内组货深度,组货单号 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
if(categorySKCList != undefined) { | |
categorySKCList.forEach(function (skcId) { | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId) | |
//.changeAttribute("C8_CW_HWDepth", "integer", skcNode.finalQty) | |
.changeAttribute("C8_CW_HWPick", "boolean", true) | |
.changeAttribute("UR_CW_GroupBillNo", "ref", weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
// if(orderType == "N"){//计划单 | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
// }else{ | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
// } | |
//0521 不分渠道 都取UR_Colorway_PLMUniqueValue | |
var urSkcNode = getNode(ac, skcId); | |
if (urSkcNode.UR_Colorway_OKCode == "") { | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode", "UR_Colorway_PLMUniqueValue", true); | |
} | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,urSkcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, true); | |
}); | |
} | |
}); | |
if(flag) { | |
var LookProducts = weekNode.LookProducts; | |
var mcNode = getNode(ac, weekNode.__Parent__); | |
var groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 2); | |
} | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status", "enum", "UR_ZHStatus:Complete"); | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag", "boolean", "true"); | |
ac.m_writer.changeNode(weekNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag", "boolean", "true"); | |
}else{ | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status", "enum", "UR_ZHStatus:Lock"); | |
} | |
//区分检核还是确认 | |
if(flag){ | |
jp.alert("海外组货确认完成!"); | |
ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete"); | |
}else{ | |
jp.alert("海外组货检核完成!"); | |
} | |
//海外组货深度逻辑在前面 | |
//var skcsList = skcsData.list; | |
// skcsData.skcIds.forEach(function(skcId){ | |
// var skcNode = skcsList[skcId]; | |
// ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_HWDepth","integer",skcNode.finalQty); | |
// ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_HWChangeTag","boolean",false); | |
// }); | |
//将结果写入SKC上,电商组货深度 | |
//ac.m_writer.changeNode(weekNode.$URL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete"); | |
var mentions = getGroup(ac, "电商买手"); | |
var subject = "组货确认消息";//主题 | |
var comments = monthNode.$Name + "的" + weekNode.$Name + "组货已确认";//消息文本 | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
//SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
}else{ | |
jp.alert(errMsg.join("</BR>")); | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
} | |
if (ac.widget.viewParent.getChildView("C8_HWWeekTargets") != undefined) { | |
ac.widget.viewParent.getChildView("C8_HWWeekTargets").refreshData(); | |
} | |
//Agnes 更新弱管控品类目标 | |
Object.keys(targetTableNode.weakWeekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
var weekSKCUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//周 可超宽度剩余C8_MCMC_ExcessSKCRemaining | |
var weekSKCDepthTarget = weekSKCTarget+weekSKCUpperTarget; | |
if(skcsData.weakCategoryKey[key]&& weekSKCDepthTarget>0) { | |
var catKeyNode = skcsData.weakCategoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish", "double", finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "integer", skcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish", "integer", styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "integer", finalQty);//组货深度 | |
} | |
}); | |
if (ac.widget.viewParent.getChildView("C8_MCMaterialsHW") != undefined) { | |
ac.widget.viewParent.getChildView("C8_MCMaterialsHW").refreshData(); | |
} | |
ac.widget.refreshData(); | |
return true; | |
} | |
/** | |
* 组货时,更改 styelattr 层的UR_StyleAttributes_GroupBillNo 组货单号赋值逻辑 | |
* @param ac | |
* @param lookProductNode | |
* @param currentNode | |
* @param billNo | |
* @param isZhConfirm | |
* @param chanleType 0 国内组货 1 电商组货 2 海外组货 | |
*/ | |
function updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute ,currentNode, billNo, isZhConfirm, chanleType) { | |
var styleUrl = lookProductNode.ProductStyle; | |
var style = getNode(ac,styleUrl); | |
var styleAttr = getNode(ac,style.Attributes); | |
if(isZhConfirm){ | |
//确认组货,更新组货单号 | |
ac.m_writer.changeNode(styleAttr.$URL).changeAttribute("UR_StyleAttributes_GroupBillNo","enum",billNo); | |
ac.m_writer.changeNode(styleUrl).changeAttribute("UR_Style_GroupOrderAattribute", "enum", groupOrderAattribute); | |
}else{ | |
C8_CancellConfirmCleanData(ac, lookProductNode, chanleType); | |
} | |
} | |
/** | |
* 组货取消 清數據 | |
* @param ac | |
* @param lookProductNode | |
* @param chanleType 0 国内组货 1 电商组货 2 海外组货 | |
* @constructor | |
*/ | |
function C8_CancellConfirmCleanData(ac, lookProductNode, chanleType) { | |
skcNode = getNode(ac,lookProductNode.C8_MCP_SKC); | |
var isAllCancel = false; | |
if (chanleType==0){ | |
isAllCancel = skcNode.C8_CW_HWDepth == 0 && skcNode.C8_CW_DSDepth == 0; | |
}else if (chanleType==1){ | |
isAllCancel = skcNode.C8_CW_GNDepth == 0 && skcNode.C8_CW_HWDepth == 0 | |
}else if (chanleType==2){ | |
isAllCancel = skcNode.C8_CW_GNDepth == 0 && skcNode.C8_CW_DSDepth == 0; | |
} | |
// if (isAllCancel) { | |
// var styleUrl = lookProductNode.ProductStyle; | |
// var style = getNode(ac, styleUrl); | |
// var styleAttr = getNode(ac, style.Attributes); | |
// // ac.m_writer.changeNode(styleAttr.$URL).changeAttribute("UR_StyleAttributes_GroupBillNo", "enum", "UR_enum_billno:"); | |
// // ac.m_writer.changeNode(skcNode.$URL).changeAttribute("UR_Colorway_OKCode", "string", ""); | |
// } | |
} | |
//从规则表9的过滤结果中,获取对应的价格带列表 | |
function getPriceRange(ruleTablesResults){ | |
var priceRange = new Map(); | |
if(ruleTablesResults && ruleTablesResults.length>0){ | |
ruleTablesResults.forEach(function(rule){ | |
if(!priceRange.get("low") || priceRange.get("low") > rule.UR_SDS_PriceLow){ | |
priceRange.set("low", rule.UR_SDS_PriceLow); | |
} | |
if(!priceRange.get("high") || priceRange.get("high") < rule.UR_SDS_PriceHigh){ | |
priceRange.set("high", rule.UR_SDS_PriceHigh); | |
} | |
}); | |
} | |
return priceRange; | |
} | |
//根据周(单号)获取对应的周目标表,按照商品层+品类+中品类key进行汇总 | |
//每个key下,只有一条周目标和一条月目标 | |
//20240220 Agnes 增加强管控周目标过滤以及存储弱管控 | |
function searchTargetTable(weekNode) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
var retObj = {weekTarget:{},weekKey:{},monthTarget:{},monthKey:{},weakWeekKey:{},weakWeekTarget:{},weakMonthKey:{},weakMonthTarget:{}}; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL); | |
var dependcyPath = ["Child:__Parent__/Child:__Parent__"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
if(res){ | |
var weekNodes = res.getResultNodes(); | |
var monthNodes = res.getNonResultNodes(); | |
var skcs = 0; | |
var amount = 0; | |
var monthPlanAmount = 0;//月企划总金额,设计师系列汇总用 | |
var monthGroupedAmount = 0;//月非末单已组总金额(不管单有没有完成),设计师系列末单检核用 | |
//var monthSkcs = 0;//月企划总skc数,设计师系列汇总用 | |
weekNodes.forEach(function(node,index){ | |
var monthId = node.__Parent__; | |
var monthNode = res.getNode(monthId); | |
var mcNode = res.getNode(monthNode.__Parent__) | |
node["monthTarget"]=monthNode; | |
var monthKeyStr = getEnumValue(monthNode.C8_MCM_CommodityType)+getEnumValue(monthNode.C8_MCM_ProductLargeType)+getEnumValue(monthNode.C8_MCM_CategoryInPlan)+getEnumValue(monthNode.UR_MCM_Silhouette); | |
var weekKeyStr = monthKeyStr;// + weekNode.$Name | |
//如果为强管控Node则存储作计算用 Agnes: 品类管控变更 | |
if(node.UR_MCMC_Control) { | |
skcs = skcs + node.C8_MCMC_GroupGoodsSKC; | |
amount = amount + node.C8_MCMC_GroupGoodsAmount; | |
monthPlanAmount = monthPlanAmount + monthNode.C8_MCM_PlannedAmount; | |
monthGroupedAmount = monthGroupedAmount + monthNode.C8_MCM_MonthGroupGoodsAmountNotLast; | |
//monthSkcs = monthSkcs + monthNode.C8_MCM_PlannedSKC; | |
retObj.weekKey[weekKeyStr]=node.$URL;//作为索引,待后续使用 | |
retObj.weekTarget[weekKeyStr]=node; | |
retObj.monthKey[monthKeyStr]=monthNode.$URL;//作为索引,待后续使用 | |
retObj.monthTarget[monthKeyStr]=monthNode; | |
}else{//存储到弱管控 Agnes: 品类管控变更 | |
retObj.weakWeekKey[weekKeyStr]=node.$URL; | |
retObj.weakWeekTarget[weekKeyStr]=node; | |
retObj.weakMonthKey[monthKeyStr]=monthNode.$URL; | |
retObj.weakMonthTarget[monthKeyStr]=monthNode; | |
} | |
}); | |
//retObj.weekTarget = res.getResultNodes(); | |
//retObj.monthTarget = res.getNonResultNodes(); | |
retObj.weekSkcs = skcs; | |
retObj.weekAmount = amount; | |
retObj.monthPlanAmount = monthPlanAmount; | |
retObj.monthGroupedAmount = monthGroupedAmount; | |
//retObj.monthSkcs = monthSkcs; | |
} | |
return retObj; | |
}; | |
//20240407 Agnes 新增周skc宽度和金额汇总 | |
function searchTargetTableWeek(weekNode) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
var retObj = {weekSkcs, weekAmount, weekTarget:{},weekKey:{},monthTarget:{},monthKey:{},mcTarget:{},weakWeekKey:{},weakWeekTarget:{},weakMonthKey:{},weakMonthTarget:{}}; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL); | |
var dependcyPath = ["Child:__Parent__/Child:__Parent__"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
if(res){ | |
var weekNodes = res.getResultNodes(); | |
var monthNodes = res.getNonResultNodes(); | |
var skcs = 0; | |
var amount = 0.0; | |
weekNodes.forEach(function(node,index){ | |
var monthId = node.__Parent__; | |
var monthNode = res.getNode(monthId); | |
var mcNode = res.getNode(monthNode.__Parent__) | |
node["monthTarget"]=monthNode; | |
var monthKeyStr = getEnumValue(monthNode.C8_MCM_CommodityType)+getEnumValue(monthNode.C8_MCM_ProductLargeType)+getEnumValue(monthNode.C8_MCM_CategoryInPlan)+getEnumValue(monthNode.UR_MCM_Silhouette); | |
var weekKeyStr = monthKeyStr;// + weekNode.$Name | |
var mcKeyStr = monthKeyStr; | |
//如果为强管控Node则存储作计算用 Agnes: 品类管控变更 | |
if(node.UR_MCMC_Control) { | |
skcs = skcs + node.C8_MCMC_GroupGoodsSKC; | |
amount = amount + node.C8_MCMC_GroupGoodsAmount; | |
retObj.weekKey[weekKeyStr]=node.$URL;//作为索引,待后续使用 | |
retObj.weekTarget[weekKeyStr]=node; | |
retObj.monthKey[monthKeyStr]=monthNode.$URL;//作为索引,待后续使用 | |
retObj.monthTarget[monthKeyStr]=monthNode; | |
}else{//存储到弱管控 Agnes: 品类管控变更 | |
retObj.weakWeekKey[weekKeyStr]=node.$URL; | |
retObj.weakWeekTarget[weekKeyStr]=node; | |
retObj.weakMonthKey[monthKeyStr]=monthNode.$URL; | |
retObj.weakMonthTarget[monthKeyStr]=monthNode; | |
} | |
retObj.mcTarget[mcKeyStr]=mcNode; | |
}); | |
retObj.weekSkcs = skcs; | |
retObj.weekAmount = amount; | |
} | |
return retObj; | |
}; | |
function searchTargetTableMonth(monthNode) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
var retObj = {weekSkcs, weekAmount, weekTarget:{},weekKey:{},monthTarget:{},monthKey:{},weakWeekKey:{},weakWeekTarget:{},weakMonthKey:{},weakMonthTarget:{}}; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("__Parent__", xml.OP_EQUALS, monthNode.$URL, "Child:__Parent__"); | |
var dependcyPath = ["Child:__Parent__/Child:__Parent__"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
if(res){ | |
var weekNodes = res.getResultNodes(); | |
var skcs = 0; | |
var amount = 0.0; | |
weekNodes.forEach(function(node,index){ | |
var monthId = node.__Parent__; | |
var monthNode = res.getNode(monthId); | |
var mcNode = res.getNode(monthNode.__Parent__) | |
node["monthTarget"]=monthNode; | |
var monthKeyStr = getEnumValue(monthNode.C8_MCM_CommodityType)+getEnumValue(monthNode.C8_MCM_ProductLargeType)+getEnumValue(monthNode.C8_MCM_CategoryInPlan)+getEnumValue(monthNode.UR_MCM_Silhouette); | |
var weekKeyStr = monthKeyStr;// + weekNode.$Name | |
//如果为强管控Node则存储作计算用 Agnes: 品类管控变更 | |
if(node.UR_MCMC_Control) { | |
skcs = skcs + node.C8_MCMC_GroupGoodsSKC; | |
amount = amount + node.C8_MCMC_GroupGoodsAmount; | |
retObj.weekKey[weekKeyStr]=node.$URL;//作为索引,待后续使用 | |
retObj.weekTarget[weekKeyStr]=node; | |
retObj.monthKey[monthKeyStr]=monthNode.$URL;//作为索引,待后续使用 | |
retObj.monthTarget[monthKeyStr]=monthNode; | |
}else{//存储到弱管控 Agnes: 品类管控变更 | |
retObj.weakWeekKey[weekKeyStr]=node.$URL; | |
retObj.weakWeekTarget[weekKeyStr]=node; | |
retObj.weakMonthKey[monthKeyStr]=monthNode.$URL; | |
retObj.weakMonthTarget[monthKeyStr]=monthNode; | |
} | |
}); | |
retObj.weekSkcs = skcs; | |
retObj.weekAmount = amount; | |
} | |
return retObj; | |
}; | |
//根据周(单号)获取对应的周目标表,按照商品层+品类+中品类key+店铺URL进行汇总 | |
//每个key下,只有一条周目标和一条月目标 | |
function searchHyTargetTable(weekNode) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
//Agnes 新增弱管控品类返回值weakWeekKey:{},weakWeekTarget:{},weakMonthKey:{},weakMonthTarget:{} | |
var retObj = {weekTarget:{},weekKey:{},monthTarget:{},monthKey:{},weakWeekKey:{},weakWeekTarget:{},weakMonthKey:{},weakMonthTarget:{}}; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL); | |
var dependcyPath = ["Child:__Parent__"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
if(res){ | |
var weekNodes = res.getResultNodes(); | |
var monthNodes = res.getNonResultNodes(); | |
weekNodes.forEach(function(node,index){ | |
var monthId = node.__Parent__; | |
var monthNode = res.getNode(monthId); | |
node["monthTarget"]=monthNode; | |
var monthKeyStr = getEnumValue(monthNode.C8_MCM_CommodityType)+getEnumValue(monthNode.C8_MCM_ProductLargeType)+getEnumValue(monthNode.C8_MCM_CategoryInPlan)+getEnumValue(monthNode.UR_MCM_Silhouette)+monthNode.C8_MCM_Store; | |
var weekKeyStr = monthKeyStr;// + weekNode.$Name | |
//如果为强管控Node则存储作计算用 Agnes: 品类管控变更 | |
if(node.UR_MCMC_Control) { | |
retObj.weekKey[weekKeyStr]=node.$URL;//作为索引,待后续使用 | |
retObj.weekTarget[weekKeyStr]=node; | |
retObj.monthKey[monthKeyStr]=monthNode.$URL;//作为索引,待后续使用 | |
retObj.monthTarget[monthKeyStr]=monthNode; | |
}else{//存储到弱管控 Agnes: 品类管控变更 | |
retObj.weakWeekKey[weekKeyStr]=node.$URL; | |
retObj.weakWeekTarget[weekKeyStr]=node; | |
retObj.weakMonthKey[monthKeyStr]=monthNode.$URL; | |
retObj.weakMonthTarget[monthKeyStr]=monthNode; | |
} | |
}); | |
//retObj.weekTarget = res.getResultNodes(); | |
//retObj.monthTarget = res.getNonResultNodes(); | |
} | |
return retObj; | |
}; | |
//获取电商的目标表 | |
function searchTargetTableDianShang(weekNode) { | |
var search = new Search(); | |
var q = search.getQuery(); | |
//20240410 Agnes 新增月categoryKey已组skc汇总(跨等级),检核最后一单用 | |
var retObj = {monthSum:{},weekTarget:{},weekKey:{},monthTarget:{},monthKey:{},classLevel:{},weakWeekKey:{},weakWeekTarget:{},weakMonthKey:{},weakMonthTarget:{}}; | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL); | |
var dependcyPath = ["Child:__Parent__"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
if(res){ | |
var weekNodes = res.getResultNodes(); | |
var targetAmountUpper = 0;//月目标组货金额上限 | |
var targetAmountLower = 0; //月目标组货金额下限 | |
var zhAmount = 0;//月已组金额 | |
weekNodes.forEach(function(node,index){ | |
var monthId = node.__Parent__; | |
var monthNode = res.getNode(monthId); | |
//记录周目标的月目标对象 | |
node["monthTarget"]=monthNode; | |
var classLevel = getEnumValue(monthNode.C8_MCM_DSLevel); | |
//这里记录一个品类的key,需要在组货计算完成后,获取同品类不同级别的上下线值,然后根据组货深度,给出建议的组货等级 | |
var categoryKey = getEnumValue(monthNode.C8_MCM_CommodityType)+getEnumValue(monthNode.C8_MCM_ProductLargeType)+getEnumValue(monthNode.C8_MCM_CategoryInPlan)+getEnumValue(monthNode.UR_MCM_Silhouette); | |
var minClassValue = monthNode.C8_MCM_PlannedLevelStart; | |
var maxClassValue = monthNode.C8_MCM_PlannedLevelEnd; | |
monthNode["categoryKey"]=categoryKey;//将标记存放到monthNode上 | |
if(!retObj.classLevel[categoryKey]){ | |
retObj.classLevel[categoryKey] = []; | |
} | |
//记录同品类不同级别的上下线值,便于后续计算 | |
retObj.classLevel[categoryKey].push({level:classLevel,min:minClassValue,max:maxClassValue}); | |
//记录当前月目标上的不同级别的上下限值 | |
//电商组货Key=商品层+品类+中品类+级别 | |
var monthKeyStr = categoryKey+classLevel; | |
var weekKeyStr = monthKeyStr;// + weekNode.$Name | |
//如果为强管控Node则存储作计算用 Agnes: 品类管控变更 | |
//强管控的汇总品类的已组货SKC数量,用于检核最后一单 20240410 Agnes | |
if(node.UR_MCMC_Control) { | |
retObj.weekKey[weekKeyStr]=node.$URL;//作为索引,待后续使用 | |
retObj.weekTarget[weekKeyStr]=node; | |
retObj.monthKey[monthKeyStr]=monthNode.$URL;//作为索引,待后续使用 | |
retObj.monthTarget[monthKeyStr]=monthNode; | |
if(!retObj.monthSum[categoryKey]){ | |
retObj.monthSum[categoryKey]={monthZHSkcs:0,monthCatNSkcs:0}; | |
} | |
//记录每个品类的已组skc数量,用于月末单检核 | |
retObj.monthSum[categoryKey].monthZHSkcs=retObj.monthSum[categoryKey].monthZHSkcs+monthNode.C8_MCM_MonthGroupGoodsSKC;//monthZHSkcs数加月目标已组 | |
//记录强管控月目标组货总金额上下限,用于设计师系列月末单检核 | |
targetAmountUpper = targetAmountUpper + monthNode.C8_MCM_ExcessAmount + monthNode.C8_MCM_PlannedAmount; | |
targetAmountLower = targetAmountLower + monthNode.C8_MCM_ReduceAmount + monthNode.C8_MCM_PlannedAmount; | |
zhAmount = zhAmount + monthNode.C8_MCM_MonthGroupGoodsAmount; | |
}else{//存储到弱管控 Agnes: 品类管控变更 | |
retObj.weakWeekKey[weekKeyStr]=node.$URL; | |
retObj.weakWeekTarget[weekKeyStr]=node; | |
retObj.weakMonthKey[monthKeyStr]=monthNode.$URL; | |
retObj.weakMonthTarget[monthKeyStr]=monthNode; | |
} | |
//品类N级skc数量统计,无需管强弱管控,因为弱管控对应的强管控目标不带等级 | |
if("N" == classLevel){ | |
if(!retObj.monthSum[categoryKey]){ | |
retObj.monthSum[categoryKey]={monthZHSkcs:0,monthCatNSkcs:0}; | |
} | |
retObj.monthSum[categoryKey].monthCatNSkcs=retObj.monthSum[categoryKey].monthCatNSkcs+monthNode.C8_MCM_MonthGroupGoodsSKC;//monthCatNSkcs数加月目标已组 | |
} | |
}); | |
//retObj.weekTarget = res.getResultNodes(); | |
//retObj.monthTarget = res.getNonResultNodes(); | |
retObj.targetAmountUpper = targetAmountUpper; | |
retObj.targetAmountLower = targetAmountLower; | |
retObj.zhAmount = zhAmount; | |
} | |
return retObj; | |
}; | |
//设置规则表属性 Jarvis | |
function setRuleTemple(ac,newURL){ | |
var fieldList = ac?.m_formData.m_fields; | |
var yearField = fieldList.filter(field => { | |
return field.m_id == "C8_SD_YearSeaon" | |
}); | |
var brandField = fieldList.filter(field => { | |
return field.m_id == "C8_SD_Brand" | |
}); | |
var chanelField = fieldList.filter(field => { | |
return field.m_id == "C8_SD_Channel" | |
}); | |
var serField = fieldList.filter(field => { | |
return field.m_id == "C8_SD_ProductSeriation" | |
}); | |
var descriptionField = fieldList.filter(field => { | |
return field.m_id == "Description" | |
}); | |
var year = yearField.length > 0 ? yearField[0].m_control.displayedValue : "centric:"; | |
if(year != "centric:"){ | |
year = searchNodeURL("Season", year); | |
} | |
var brand = brandField.length > 0 ? brandField[0].m_control.value : "UR_enum_Brand:"; | |
var chanel = chanelField.length > 0 ? chanelField[0].m_control.value : "UR_enum_Channel:"; | |
var ser = serField.length > 0 ? serField[0].m_control.value : "UR_enum_ProductSeriation:"; | |
var description = descriptionField.length > 0 ? descriptionField[0].m_control.value : ""; | |
ac.m_writer.changeNode(newURL).changeAttribute("C8_SD_YearSeaon","ref",year); | |
ac.m_writer.changeNode(newURL).changeAttribute("C8_SD_Brand","enum",brand); | |
ac.m_writer.changeNode(newURL).changeAttribute("C8_SD_Channel","enum",chanel); | |
ac.m_writer.changeNode(newURL).changeAttribute("C8_SD_ProductSeriation","enum",ser); | |
ac.m_writer.changeNode(newURL).changeAttribute("Description","string",description); | |
}; | |
//给定数值(组货深度),判断数值对应的级别-电商组货计算后,获取建议等级 | |
//targetTableNode = result of searchTargetTableDianShang Function | |
function getClassLevel(initQty,categoryKey,targetTableNode){ | |
var retClass = ""; | |
if(targetTableNode && targetTableNode.classLevel && targetTableNode.classLevel[categoryKey]){ | |
var classList = targetTableNode.classLevel[categoryKey]; | |
if(classList.length>0){ | |
for(var i=0; i<classList.length;i++){ | |
var min = classList[i].min; | |
var max = classList[i].max; | |
if(initQty>=min && initQty<=max){ | |
retClass = classList[i].level; | |
break; | |
} | |
} | |
} | |
} | |
return retClass; | |
} | |
//中品类转换映射 | |
const midCatMapping = new Map([ | |
["BU","BK"], | |
["BV","BQ"], | |
["BW","BM"], | |
["BX","BO"], | |
["BY","BJ"], | |
["BA","BS"], | |
["BB","BT"], | |
["BF","BL"], | |
["BG","BN"], | |
["BH","BE"] | |
]) | |
//获取组货结果SKC对象,并将需要计算的属性字段重新存储, | |
//并按照商品层+品类+中品类进行分组存储 | |
//DStyle=D款和大片款 ChannelSKC:==指定渠道款,SpecialSKC:特殊款 | |
function getAndGroupSKCData(ac, resultURLs, controlRuleKeys) { | |
//Agnes 返回值新增弱管控品类信息 weakCategoryKey:{} | |
var resultJSON = {skcIds:[],list:{},skcs:{},minDeepRule3:[],prodCatSkcs:{},categoryKey:{},weakCategoryKey:{},errors:[],finalConfirmError:[], | |
"S":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[]}, | |
"R":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[],styles:{list:[],skcs:{},skcCount:{}}}, | |
"B":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[],styles:{list:[],skcs:{},skcCount:{}}} | |
}; | |
var stylesList = []; | |
if(resultURLs && resultURLs.length>0){ | |
resultURLs.forEach(function(url,index){ | |
var nodeObj = getNode(ac,url); | |
if(nodeObj && nodeObj.$Type == "MCProduct"){ | |
if(nodeObj.C8_MCP_SKC == "centric:"){ | |
return; | |
} | |
var skcObj = getNode(ac,nodeObj.C8_MCP_SKC); | |
var skcName = skcObj.$Name; | |
var skcCode = skcObj.UR_Colorway_PLMUniqueValue; | |
var skcId = skcObj.$URL; | |
var styleNode = getNode(ac,skcObj.__Parent__); | |
var styleId = styleNode.$Name; | |
var styleAttNode = getNode(ac,styleNode.Attributes); | |
// miles 0119 获取系列用于后续判断是否是acc | |
var cat1Node = getNode(ac,styleNode.Category1); | |
//从Style和Attributes上获取字段信息 | |
var modNumber = styleNode.UR_Style_ModuleNumber;//模块号 | |
var priceStr = getEnumValue(styleAttNode.UR_StyleAttributes_GroupCarPrice); //组货单价 | |
var price = 0; | |
if(priceStr && priceStr!=""){ | |
priceStr = priceStr.trim(); | |
price = parseInt(priceStr); | |
} | |
var mcpPrice = nodeObj.C8_MCP_Price; | |
var commodityType = styleNode.UR_Style_CommodityType;//商品层 | |
var commodityName = locale.getEnumName(commodityType);//商品层名称 | |
var commodityTypeKey = getEnumValue(commodityType); | |
var category = styleNode.UR_Style_ProductLargeType; //品类 | |
var categoryName = locale.getEnumName(category);//品类名称 | |
var midCategory = styleAttNode.UR_StyleAttributes_MiddleCategoryType;//UR_StyleAttributes_CategoryInPlan; //中品类 | |
var midCategoryName = locale.getEnumName(midCategory);//中品类名称 | |
var subCategory = styleAttNode.UR_StyleAttributes_Silhouette;//子品类、 | |
var subCategoryName = locale.getEnumName(subCategory);//子品类名称 | |
var productStyle = styleNode.UR_Style_ProductStyleCount;//风格 | |
//var productStyleName = locale.getEnumName(productStyle);//风格名称 | |
//productStyle = getEnumValue(productStyle);//风格key | |
var styleDeepCoefficient = styleNode.UR_Style_DepthCoefficient;//单款深度系数 double | |
var styleDeepIndex = styleNode.UR_Style_DepthIndex;//单款深度指数 enum | |
var styleDeepIndexValue = getEnumValue(styleDeepIndex); | |
var monthAvgDeep = styleNode.UR_Style_MonthAvgDepth;//月平均深度,参考值 | |
//从SKC上获取字段信息 | |
var skcDeepIndex = getEnumValue(skcObj.UR_CW_BestBadIndex);//单SKC畅滞指数 | |
var skcDeepCoefficient = skcObj.UR_CW_BestBadCoefficient;//单SKC畅滞系数 | |
var look1 = skcObj.UR_Colorway_Look1;//Look1 boolean | |
var look2 = skcObj.UR_Colorway_Look2;//Look2 boolean | |
var look3 = skcObj.UR_Colorway_Look3;//Look3 boolean | |
var look4 = skcObj.UR_Colorway_Look4;//Look4 boolean | |
var look5 = skcObj.UR_Colorway_Look5;//Look5 boolean | |
var look6 = skcObj.UR_Colorway_Look6;//Look6 boolean | |
var initQty = skcObj.C8_CW_InitialSKCDepth; //初始深度,改值已经经过款式深度指数*skc畅滞指数*款式平均深度 | |
//var calInitQty = parseInt(styleDeepCoefficient*skcDeepCoefficient*monthAvgDeep); | |
var changeInitQty = false; | |
//if(calInitQty != initQty){ | |
// changeInitQty = true;//此处为防呆处理,如果skc上的初始深度没有经过计算,此处记录,后续组货完成后更新skc的初始组货深度。 | |
// initQty = calInitQty; | |
//} | |
var fixQty = false; | |
var finalDeep = nodeObj.C8_MCP_AdjustingDepth;//获取用户填写的调整深度 | |
var finalDStyleAmout = nodeObj.C8_MCP_DExcessAmount; | |
var finalAmount = finalDeep*price; | |
var userFix = nodeObj.C8_MCP_SKCLock; | |
if(userFix){ | |
fixQty = true; | |
initQty = finalDeep; | |
} | |
//初始组货金额 | |
var initAmount = initQty*price; | |
//陈列、橱窗、渠道款,任意有值,则为特殊款 | |
var look = skcObj.C8_CW_MainPromotion;// styleNode.UR_Style_Look;//主推款 | |
var isLook = false; | |
var lookName = locale.getEnumName(look); | |
var display = skcObj.C8_CW_DisplayType;//陈列类型 | |
var displayName = locale.getEnumName(display); | |
var specialType = skcObj.C8_CW_Special;//特殊款类型 D款,大片款,英雄款 | |
var specialTypeName = locale.getEnumName(specialType); | |
var channelType = skcObj.C8_CW_NSStyle;//指定渠道类型 | |
var channelTypeName = locale.getEnumName(channelType); | |
var isChannelStyle = getEnumValue(channelType)==""?false:true; | |
var isDisplayStyle = getEnumValue(display)==""?false:true; | |
var isDStyle = getEnumValue(specialType)=="trailer_dedicated"||getEnumValue(specialType)=="SD"; | |
var isSpecialStyle = false; | |
//主题款记录特殊款类型,后续分别计算最低深度 | |
if(commodityTypeKey){ | |
//是否特殊款,用于后续金额归靠时,优先锁定特殊款金额 | |
if(look1 || look2 || look3 || look4 || look5 || look6){ | |
isLook = true; | |
} | |
//非D款和大片款的特殊款 | |
if( isLook|| (specialTypeName != "" && !isDStyle) || isChannelStyle || isDisplayStyle){ | |
isSpecialStyle = true; //非D款和大片款,同时是特殊款 | |
} | |
//渠道款 | |
if(isChannelStyle){ | |
resultJSON[commodityTypeKey].channelSKC.push(skcId); | |
} | |
//D款和大片款 - 按照表3计算最低深度 | |
//将D款,大片款,特殊款放到一个组中,用于按照规则表3计算最低深度 | |
if(isSpecialStyle || isDStyle){ | |
resultJSON.minDeepRule3.push(skcId);//其中包含了常销款和基本款的D款和大片款的情况 | |
} | |
} | |
//中品类映射转换 | |
var midCatKey = getEnumValue(midCategory); | |
if(midCatMapping.has(midCatKey)){ | |
midCatKey = midCatMapping.get(midCatKey); | |
} | |
//Agnes: 品类管控变更 拼接skc的管控key 品类_中品类_子品类_级别,并对比弱管控key | |
var skcControlKey = getEnumValue(category)+midCatKey+getEnumValue(subCategory) + getEnumValue(nodeObj.C8_MCP_SuggestedLevel); | |
var skcWeakControlKey = "";//skc弱管控品类key | |
var skcWeakControlKeyName = ""; | |
var skcCategoryKey = ""; | |
var skcCategoryKeyName =""; | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){//弱管控品类,skcCategoryKey只需要到品类,并生成弱管控品类key | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category); | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】"; | |
//if (cat1Node.$Name == "UR_ACC"){//区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
//skcWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+getEnumValue(subCategory); | |
skcWeakControlKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】"; | |
//}else{ | |
skcWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey | |
skcWeakControlKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
//} | |
}else {//原来的逻辑 | |
//存储categoryKey,用于后续组货计算 // miles 0119 区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
//if (cat1Node.$Name == "UR_ACC"){ | |
// skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+getEnumValue(subCategory); | |
// skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】"; | |
//}else{ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
//} | |
} | |
if(!resultJSON.categoryKey[skcCategoryKey]){ | |
resultJSON.categoryKey[skcCategoryKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
//记录每个品类的skc数量,用于后续宽度计算(常销款,基本款) | |
resultJSON.categoryKey[skcCategoryKey].skcs=resultJSON.categoryKey[skcCategoryKey].skcs+1;//skc数加1 | |
/* | |
//新增记录每个大品类的SKC数量汇总 用于后续宽度计算 | |
var prodCatKey = getEnumValue(commodityType)+getEnumValue(category); | |
if(!resultJSON.prodCatSkcs[prodCatKey]){ | |
resultJSON.prodCatSkcs[prodCatKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
resultJSON.prodCatSkcs[prodCatKey].skcs=resultJSON.prodCatSkcs[prodCatKey].skcs+1;//skc数加1 | |
*/ | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.categoryKey[skcCategoryKey].styles=resultJSON.categoryKey[skcCategoryKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.categoryKey[skcCategoryKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.categoryKey[skcCategoryKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
//D款大片款组货金额-超出金额 | |
var currentFinalDStyleAmout = resultJSON.categoryKey[skcCategoryKey].finalDStyleAmout; | |
currentFinalDStyleAmout += finalDStyleAmout; | |
resultJSON.categoryKey[skcCategoryKey].finalDStyleAmout = currentFinalDStyleAmout; | |
//组货金额,组货深度 | |
resultJSON.categoryKey[skcCategoryKey].finalQty = currentFinalQty; | |
resultJSON.categoryKey[skcCategoryKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.categoryKey[skcCategoryKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
if(skcWeakControlKey != ""){//弱管控品类时保存弱管控品类数据 | |
if(!resultJSON.weakCategoryKey[skcWeakControlKey]){ | |
resultJSON.weakCategoryKey[skcWeakControlKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
//记录每个品类的skc数量,用于后续宽度计算(常销款,基本款) | |
resultJSON.weakCategoryKey[skcWeakControlKey].skcs=resultJSON.weakCategoryKey[skcWeakControlKey].skcs+1;//skc数加1 | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].styles=resultJSON.weakCategoryKey[skcWeakControlKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.weakCategoryKey[skcWeakControlKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.weakCategoryKey[skcWeakControlKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
//D款大片款组货金额-超出金额 | |
var currentFinalDStyleAmout = resultJSON.weakCategoryKey[skcWeakControlKey].finalDStyleAmout; | |
currentFinalDStyleAmout += finalDStyleAmout; | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalDStyleAmout = currentFinalDStyleAmout; | |
//组货金额,组货深度 | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalQty = currentFinalQty; | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
} | |
//获取海外的数据值 | |
//1.深度 | |
var storeVolumnMap = new Map(Object.entries(nodeObj.C8_MCP_StoreVolumn)); | |
var storeKey = ""; | |
var storeWeakControlKey = ""; | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){//汇总到品类生成storeKey | |
storeKey = getEnumValue(commodityType)+getEnumValue(category); | |
storeWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+getEnumValue(midCategory); | |
}else{ | |
storeKey = getEnumValue(commodityType)+getEnumValue(category)+getEnumValue(midCategory); | |
} | |
var hylist = []; | |
var weakHyList = []; | |
var weakVolumnMap = new Map(); | |
var volumnMap = new Map(); | |
var resValue = 0; | |
var catKey = ""; | |
var weakCatKey = ""; | |
for (const [key, value] of storeVolumnMap) { | |
catKey = storeKey + key; | |
if(volumnMap.hasOwnProperty(catKey+"volumn")){ | |
resValue = volumnMap.get(catKey+"volumn") + value; | |
}else{ | |
resValue = value; | |
skcValue = value; | |
} | |
volumnMap.set(catKey+"volumn",resValue); | |
if(!resultJSON.categoryKey[catKey]){ | |
resultJSON.categoryKey[catKey]={skcs:0}; | |
} | |
if(resValue != 0){ | |
resultJSON.categoryKey[catKey].skcs=resultJSON.categoryKey[catKey].skcs+1;//skc数加1 | |
} | |
} | |
hylist.push(volumnMap); | |
if(storeWeakControlKey != "") { //存储海外弱管控数据 | |
for (const [key, value] of storeVolumnMap) { | |
weakCatKey = storeWeakControlKey + key; | |
if(weakVolumnMap.hasOwnProperty(weakCatKey+"volumn")){ | |
resValue = weakVolumnMap.get(weakCatKey+"volumn") + value; | |
}else{ | |
resValue = value; | |
skcValue = value; | |
} | |
weakVolumnMap.set(weakCatKey+"volumn",resValue); | |
if(!resultJSON.weakCategoryKey[weakCatKey]){ | |
resultJSON.weakCategoryKey[weakCatKey]={skcs:0}; | |
} | |
if(resValue != 0){ | |
resultJSON.weakCategoryKey[weakCatKey].skcs=resultJSON.weakCategoryKey[weakCatKey].skcs+1;//skc数加1 | |
} | |
} | |
weakHyList.push(weakVolumnMap); | |
} | |
//2.企划金额 | |
if(null != nodeObj.C8_MCP_AdjustingAmountHy){ | |
var amountMap = new Map(Object.entries(nodeObj.C8_MCP_AdjustingAmountHy)); | |
//var amountKey = getEnumValue(commodityType)+getEnumValue(category);//+getEnumValue(midCategory) | |
var priceMap = new Map(); | |
var weakPriceMap = new Map(); | |
var resValue = 0; | |
for (const [key, value] of amountMap) { | |
catKey = storeKey + key; | |
if(priceMap.hasOwnProperty(catKey+"price")){ | |
resValue = priceMap.get(catKey+"price") + value; | |
}else{ | |
resValue = value; | |
} | |
priceMap.set(catKey+"price",resValue); | |
} | |
hylist.push(priceMap); | |
resultJSON.categoryKey[skcCategoryKey].hylist.push(hylist); | |
if(storeWeakControlKey != "") { //存储海外弱管控数据 | |
for (const [key, value] of amountMap) { | |
weakCatKey = storeWeakControlKey + key; | |
if(weakPriceMap.hasOwnProperty(weakCatKey+"price")){ | |
resValue = weakPriceMap.get(weakCatKey+"price") + value; | |
}else{ | |
resValue = value; | |
} | |
weakPriceMap.set(weakCatKey+"price",resValue); | |
} | |
} | |
weakHyList.push(weakPriceMap); | |
} | |
//记录每个分类下的skcId | |
resultJSON.categoryKey[skcCategoryKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
} | |
//单独记录,用于一起组货计算 | |
if(!resultJSON["skcs"][skcCategoryKey]){ | |
resultJSON["skcs"][skcCategoryKey]=[]; | |
} | |
resultJSON["skcs"][skcCategoryKey].push(skcId);//按照key存储id到各自分类下 | |
//if(!controlRuleKeys.has(skcControlKey) && !controlRuleKeys.has(skcControlKey.substring(0, 4))){//强管控品类才记录进来 | |
//在按照商品层分类下分别记录各自的categoryKey | |
if(!resultJSON[commodityTypeKey]["categoryKey"].includes(skcCategoryKey)){ | |
resultJSON[commodityTypeKey]["categoryKey"].push(skcCategoryKey); | |
} | |
//单独记录D款和大片款 | |
if(isDStyle){ | |
if(!resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey]){ | |
resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey]=[]; | |
} | |
resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey].push(skcId);//按照key存储id到各自分类下 | |
//在按照商品层分类下分别记录各自的categoryKey | |
if(!resultJSON[commodityTypeKey]["dCategoryKey"].includes(skcCategoryKey)){ | |
resultJSON[commodityTypeKey]["dCategoryKey"].push(skcCategoryKey); | |
} | |
} | |
//} | |
//检查style和skc上的指数和系数是否填写 | |
var errorMsg = ""; | |
if(price==0){ | |
errorMsg +="【组货单价等于0】"; | |
} | |
if(styleDeepCoefficient<=0){ | |
errorMsg +="【单款深度系数必填,且不能小于或等于0】"; | |
} | |
if(styleDeepIndexValue==""){ | |
errorMsg +="【单款深度指数必填】"; | |
} | |
if(skcDeepCoefficient<=0){ | |
errorMsg +="【单SKC畅滞系数必填,且不能小于或等于0】"; | |
} | |
if(skcDeepIndex==""){ | |
errorMsg +="【单SKC畅滞指数必填】"; | |
} | |
//主题款模块号必填 | |
if(commodityTypeKey=="S" && modNumber==""){ | |
errorMsg +="【主题款的模块号必填】"; | |
} | |
if(errorMsg!=""){ | |
var msg = skcCategoryKeyName+"skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:"+errorMsg; | |
console.log(msg); | |
resultJSON.errors.push(msg); | |
} | |
//组货确认时,需要检查组货单价和调整深度必填 | |
if(finalDeep<=0 || price<=0){ | |
var msg = skcCategoryKeyName+"skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:调整深度和组货单价必填!"; | |
resultJSON.finalConfirmError.push(msg); | |
} | |
//计算look的skc数量,并记录到结果的json中 | |
//主题款,并且存在模块号 look检查需要跨品类汇总,记录look下的skc,以及计算skc数量,look数量 | |
if(commodityTypeKey && commodityTypeKey=="S" && modNumber && modNumber!=""){ | |
var modJSON = resultJSON[commodityTypeKey].mods[modNumber]; | |
if(!modJSON){ | |
//lookCount:look数量,skcCount:模块内skc数量, lookSKCCount:有look标记的skc数量 | |
resultJSON[commodityTypeKey].mods[modNumber] = {skcCount:0,lookCount:0,lookSKCCount:0,looks:{list:[]}}; | |
modJSON = resultJSON[commodityTypeKey].mods[modNumber]; | |
} | |
//记录模块的skc数量 | |
modJSON.skcCount = modJSON.skcCount+1; | |
if(look1 || look2 || look3 || look4 || look5 || look6){ | |
modJSON.lookSKCCount = modJSON.lookSKCCount+1; | |
} | |
var lookName = ""; | |
var lookArray = [look1,look2,look3,look4,look5,look6]; | |
var lookNameArray = ["look1","look2","look3","look4","look5","look6"]; | |
for(var i=0;i<6;i++){ | |
var lookA = lookArray[i]; | |
var lookAName = lookNameArray[i]; | |
if(lookA){ | |
if(!modJSON.looks.list.includes(lookAName)){ | |
modJSON.looks.list.push(lookAName); | |
modJSON.lookCount = modJSON.lookCount+1; | |
} | |
if(!modJSON.looks[lookAName]){ | |
modJSON.looks[lookAName]=[]; | |
modJSON.looks[lookAName].push(skcId) | |
}else{ | |
modJSON.looks[lookAName].push(skcId); | |
} | |
} | |
} | |
} | |
//如果是常销款或基本款, 同一个款内 SKC 要求: 按照款号汇总, | |
if(commodityTypeKey && commodityTypeKey=="R" || commodityTypeKey=="B"){ | |
//按照款式汇总skc数量 | |
var stylesJson = resultJSON[commodityTypeKey].styles; | |
if(stylesJson.list.includes(styleId)){ | |
stylesJson.skcCount[styleId]=stylesJson.skcCount[styleId]+1; | |
stylesJson.skcs[styleId].push(skcId);//记录一个款式下的skc | |
}else{ | |
stylesJson.skcCount[styleId]=1; | |
stylesJson.skcs[styleId] = [skcId]; | |
stylesJson.list.push(styleId); | |
} | |
} | |
//记录skc对象,用于后续组货取值和计算,其中calQty,calAmount为最后建议的深度和金额 | |
////styDeepIdx:styleDeepIndex,styDeepCoefficient:styleDeepCoefficient,skcDeepIndex:skcDeepIndex,skcDeepCoefficient:skcDeepCoefficient, | |
//字段含义说明: minQty=最低深度,minQtyD=D款大片款最低深度 initQty=初始深度 lookCalQty=计算look最低深度时的中间扣减值 | |
//calQty=建议深度 calAmount=建议金额 | |
var zhSCKObj = {"skcId": skcId,skcName:skcName,"skcCode":skcCode,"styleId":styleId,mcpId:url,categoryKey:skcCategoryKey,categoryKeyName:skcCategoryKeyName,commodityType:commodityType,commodityName:commodityName, | |
commodityTypeKey:commodityTypeKey,catId:category,catName:categoryName, midCatId:midCategory,midCatName:midCategoryName,productStyle:productStyle, | |
modNumber:modNumber,look1:look1,look2:look2,look3:look3,look4:look4,look5:look5,look6:look6,isLook:isLook, display:display,specialType:specialType,channelType:channelType,subCategory:subCategory,subCategoryName:subCategoryName, | |
lookName:lookName,displayName:displayName,specialTypeName:specialTypeName,channelTypeName:channelTypeName,isDStyle:isDStyle,isSpecialStyle:isSpecialStyle, | |
"price": price, mcpPrice:mcpPrice, "minQty": 0, "minQtyD":0, "initQty": initQty, lookCalQty:initQty,"initAmount":initAmount, "initAmountPct":0, "calQty": 0, "calAmount":0,"calAmountPct":0, | |
standardDeep:0,shopCoverCount:0, isMinQty:false, fixQty:fixQty,userFix:userFix, fixAmout:false,finalQty:finalDeep,finalAmount:finalAmount,finalDStyleAmout:finalDStyleAmout | |
}; | |
resultJSON.list[skcId]=zhSCKObj; //url-node | |
resultJSON.skcIds.push(skcId);//url index | |
} | |
}); | |
} | |
return resultJSON; | |
}; | |
//获取组货结果SKC对象,并将需要计算的属性字段重新存储, | |
//并按照商品层+品类+中品类进行分组存储 | |
//DStyle=D款和大片款 ChannelSKC:==指定渠道款,SpecialSKC:特殊款 | |
function getAndGroupSKCDataV2(ac, resultURLs, controlRuleKeys) { | |
//Agnes 返回值新增弱管控品类信息 weakCategoryKey:{} 20240407 新增总金额汇总 | |
var resultJSON = {skcIds:[],list:{},skcs:{},minDeepRule3:[],prodCatSkcs:{},categoryKey:{},weakCategoryKey:{},errors:[],finalConfirmError:[], | |
"S":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[]}, | |
"R":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[],styles:{list:[],skcs:{},skcCount:{}}}, | |
"B":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[],styles:{list:[],skcs:{},skcCount:{}}} | |
}; | |
var stylesList = []; | |
if(resultURLs && resultURLs.length>0){ | |
var amount = 0; | |
resultURLs.forEach(function(url,index){ | |
var nodeObj = getNode(ac,url); | |
if(nodeObj && nodeObj.$Type == "MCProduct"){ | |
if(nodeObj.C8_MCP_SKC == "centric:"){ | |
return; | |
} | |
var skcObj = getNode(ac,nodeObj.C8_MCP_SKC); | |
var skcName = skcObj.$Name; | |
var skcCode = skcObj.UR_Colorway_PLMUniqueValue; | |
var skcId = skcObj.$URL; | |
var styleNode = getNode(ac,skcObj.__Parent__); | |
var styleId = styleNode.$Name; | |
var styleAttNode = getNode(ac,styleNode.Attributes); | |
// miles 0119 获取系列用于后续判断是否是acc | |
var cat1Node = getNode(ac,styleNode.Category1); | |
//从Style和Attributes上获取字段信息 | |
var modNumber = styleNode.UR_Style_ModuleNumber;//模块号 | |
var priceStr = getEnumValue(styleAttNode.UR_StyleAttributes_GroupCarPrice); //组货单价 | |
var price = 0; | |
if(priceStr && priceStr!=""){ | |
priceStr = priceStr.trim(); | |
price = parseInt(priceStr); | |
} | |
var mcpPrice = nodeObj.C8_MCP_Price; | |
var commodityType = styleNode.UR_Style_CommodityType;//商品层 | |
var commodityName = locale.getEnumName(commodityType);//商品层名称 | |
var commodityTypeKey = getEnumValue(commodityType); | |
var category = styleNode.UR_Style_ProductLargeType; //品类 | |
var categoryName = locale.getEnumName(category);//品类名称 | |
var midCategory = styleAttNode.UR_StyleAttributes_MiddleCategoryType;//UR_StyleAttributes_CategoryInPlan; //中品类 | |
var midCategoryName = locale.getEnumName(midCategory);//中品类名称 | |
var subCategory = styleAttNode.UR_StyleAttributes_Silhouette;//子品类、 | |
var subCategoryName = locale.getEnumName(subCategory);//子品类名称 | |
var productStyle = styleNode.UR_Style_ProductStyleCount;//风格 | |
//var productStyleName = locale.getEnumName(productStyle);//风格名称 | |
//productStyle = getEnumValue(productStyle);//风格key | |
var styleDeepCoefficient = styleNode.UR_Style_DepthCoefficient;//单款深度系数 double | |
var styleDeepIndex = styleNode.UR_Style_DepthIndex;//单款深度指数 enum | |
var styleDeepIndexValue = getEnumValue(styleDeepIndex); | |
var monthAvgDeep = styleNode.UR_Style_MonthAvgDepth;//月平均深度,参考值 | |
//从SKC上获取字段信息 | |
var skcDeepIndex = getEnumValue(skcObj.UR_CW_BestBadIndex);//单SKC畅滞指数 | |
var skcDeepCoefficient = skcObj.UR_CW_BestBadCoefficient;//单SKC畅滞系数 | |
var look1 = skcObj.UR_Colorway_Look1;//Look1 boolean | |
var look2 = skcObj.UR_Colorway_Look2;//Look2 boolean | |
var look3 = skcObj.UR_Colorway_Look3;//Look3 boolean | |
var look4 = skcObj.UR_Colorway_Look4;//Look4 boolean | |
var look5 = skcObj.UR_Colorway_Look5;//Look5 boolean | |
var look6 = skcObj.UR_Colorway_Look6;//Look6 boolean | |
var initQty = skcObj.C8_CW_InitialSKCDepth; //初始深度,改值已经经过款式深度指数*skc畅滞指数*款式平均深度 | |
//var calInitQty = parseInt(styleDeepCoefficient*skcDeepCoefficient*monthAvgDeep); | |
var changeInitQty = false; | |
//if(calInitQty != initQty){ | |
// changeInitQty = true;//此处为防呆处理,如果skc上的初始深度没有经过计算,此处记录,后续组货完成后更新skc的初始组货深度。 | |
// initQty = calInitQty; | |
//} | |
var fixQty = false; | |
var finalDeep = nodeObj.C8_MCP_AdjustingDepth;//获取用户填写的调整深度 | |
var finalDStyleAmout = nodeObj.C8_MCP_DExcessAmount; | |
var finalAmount = finalDeep*price; | |
var userFix = nodeObj.C8_MCP_SKCLock; | |
if(userFix){ | |
fixQty = true; | |
initQty = finalDeep; | |
} | |
//初始组货金额 | |
var initAmount = initQty*price; | |
//陈列、橱窗、渠道款,任意有值,则为特殊款 | |
var look = skcObj.C8_CW_MainPromotion;// styleNode.UR_Style_Look;//主推款 | |
var isLook = false; | |
var lookName = locale.getEnumName(look); | |
var display = skcObj.C8_CW_DisplayType;//陈列类型 | |
var displayName = locale.getEnumName(display); | |
var specialType = skcObj.C8_CW_Special;//特殊款类型 D款,大片款,英雄款 | |
var specialTypeName = locale.getEnumName(specialType); | |
var channelType = skcObj.C8_CW_NSStyle;//指定渠道类型 | |
var channelTypeName = locale.getEnumName(channelType); | |
var isChannelStyle = getEnumValue(channelType)==""?false:true; | |
var isDisplayStyle = getEnumValue(display)==""?false:true; | |
var isDStyle = getEnumValue(specialType)=="trailer_dedicated"||getEnumValue(specialType)=="SD"; | |
var isSpecialStyle = false; | |
//主题款记录特殊款类型,后续分别计算最低深度 | |
if(commodityTypeKey){ | |
//是否特殊款,用于后续金额归靠时,优先锁定特殊款金额 | |
if(look1 || look2 || look3 || look4 || look5 || look6){ | |
isLook = true; | |
} | |
//非D款和大片款的特殊款 | |
if( isLook|| (specialTypeName != "" && !isDStyle) || isChannelStyle || isDisplayStyle){ | |
isSpecialStyle = true; //非D款和大片款,同时是特殊款 | |
} | |
//渠道款 | |
if(isChannelStyle){ | |
resultJSON[commodityTypeKey].channelSKC.push(skcId); | |
} | |
//D款和大片款 - 按照表3计算最低深度 | |
//将D款,大片款,特殊款放到一个组中,用于按照规则表3计算最低深度 | |
if(isSpecialStyle || isDStyle){ | |
resultJSON.minDeepRule3.push(skcId);//其中包含了常销款和基本款的D款和大片款的情况 | |
} | |
} | |
//中品类映射转换 | |
var midCatKey = getEnumValue(midCategory); | |
if(midCatMapping.has(midCatKey)){ | |
midCatKey = midCatMapping.get(midCatKey); | |
} | |
//Agnes: 品类管控变更 拼接skc的管控key 品类_中品类_子品类_级别,并对比弱管控key | |
var skcControlKey = getEnumValue(category)+midCatKey+getEnumValue(subCategory) + getEnumValue(nodeObj.C8_MCP_SuggestedLevel); | |
var skcWeakControlKey = "";//skc弱管控品类key | |
var skcWeakControlKeyName = ""; | |
var skcCategoryKey = ""; | |
var skcCategoryKeyName =""; | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){//弱管控品类,skcCategoryKey只需要到品类,并生成弱管控品类key | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category); | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】"; | |
//if (cat1Node.$Name == "UR_ACC"){//区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
//skcWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+getEnumValue(subCategory); | |
skcWeakControlKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】"; | |
//}else{ | |
skcWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey | |
skcWeakControlKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
//} | |
}else {//原来的逻辑 | |
//存储categoryKey,用于后续组货计算 // miles 0119 区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
//if (cat1Node.$Name == "UR_ACC"){ | |
// skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+getEnumValue(subCategory); | |
// skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】"; | |
//}else{ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
//} | |
} | |
if(!resultJSON.categoryKey[skcCategoryKey]){ | |
resultJSON.categoryKey[skcCategoryKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
//记录每个品类的skc数量,用于后续宽度计算(常销款,基本款) | |
resultJSON.categoryKey[skcCategoryKey].skcs=resultJSON.categoryKey[skcCategoryKey].skcs+1;//skc数加1 | |
//新增记录每个大品类的SKC数量汇总 用于后续宽度计算 | |
var prodCatKey = getEnumValue(commodityType)+getEnumValue(category); | |
if(!resultJSON.prodCatSkcs[prodCatKey]){ | |
resultJSON.prodCatSkcs[prodCatKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
resultJSON.prodCatSkcs[prodCatKey].skcs=resultJSON.prodCatSkcs[prodCatKey].skcs+1;//skc数加1 | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.categoryKey[skcCategoryKey].styles=resultJSON.categoryKey[skcCategoryKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.categoryKey[skcCategoryKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.categoryKey[skcCategoryKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
//D款大片款组货金额-超出金额 | |
var currentFinalDStyleAmout = resultJSON.categoryKey[skcCategoryKey].finalDStyleAmout; | |
currentFinalDStyleAmout += finalDStyleAmout; | |
resultJSON.categoryKey[skcCategoryKey].finalDStyleAmout = currentFinalDStyleAmout; | |
//组货金额,组货深度 | |
resultJSON.categoryKey[skcCategoryKey].finalQty = currentFinalQty; | |
resultJSON.categoryKey[skcCategoryKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.categoryKey[skcCategoryKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
if(skcWeakControlKey != ""){//弱管控品类时保存弱管控品类数据 | |
if(!resultJSON.weakCategoryKey[skcWeakControlKey]){ | |
resultJSON.weakCategoryKey[skcWeakControlKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
//记录每个品类的skc数量,用于后续宽度计算(常销款,基本款) | |
resultJSON.weakCategoryKey[skcWeakControlKey].skcs=resultJSON.weakCategoryKey[skcWeakControlKey].skcs+1;//skc数加1 | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].styles=resultJSON.weakCategoryKey[skcWeakControlKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.weakCategoryKey[skcWeakControlKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.weakCategoryKey[skcWeakControlKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
//D款大片款组货金额-超出金额 | |
var currentFinalDStyleAmout = resultJSON.weakCategoryKey[skcWeakControlKey].finalDStyleAmout; | |
currentFinalDStyleAmout += finalDStyleAmout; | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalDStyleAmout = currentFinalDStyleAmout; | |
//组货金额,组货深度 | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalQty = currentFinalQty; | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
} | |
//记录每个分类下的skcId | |
resultJSON.categoryKey[skcCategoryKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
} | |
//单独记录,用于一起组货计算 | |
if(!resultJSON["skcs"][skcCategoryKey]){ | |
resultJSON["skcs"][skcCategoryKey]=[]; | |
} | |
resultJSON["skcs"][skcCategoryKey].push(skcId);//按照key存储id到各自分类下 | |
//if(!controlRuleKeys.has(skcControlKey) && !controlRuleKeys.has(skcControlKey.substring(0, 4))){//强管控品类才记录进来 | |
//在按照商品层分类下分别记录各自的categoryKey | |
if(!resultJSON[commodityTypeKey]["categoryKey"].includes(skcCategoryKey)){ | |
resultJSON[commodityTypeKey]["categoryKey"].push(skcCategoryKey); | |
} | |
//单独记录D款和大片款 | |
if(isDStyle){ | |
if(!resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey]){ | |
resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey]=[]; | |
} | |
resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey].push(skcId);//按照key存储id到各自分类下 | |
//在按照商品层分类下分别记录各自的categoryKey | |
if(!resultJSON[commodityTypeKey]["dCategoryKey"].includes(skcCategoryKey)){ | |
resultJSON[commodityTypeKey]["dCategoryKey"].push(skcCategoryKey); | |
} | |
} | |
//} | |
//检查style和skc上的指数和系数是否填写 | |
var errorMsg = ""; | |
if(price==0){ | |
errorMsg +="【组货单价等于0】"; | |
} | |
if(styleDeepCoefficient<=0){ | |
errorMsg +="【单款深度系数必填,且不能小于或等于0】"; | |
} | |
if(styleDeepIndexValue==""){ | |
errorMsg +="【单款深度指数必填】"; | |
} | |
if(skcDeepCoefficient<=0){ | |
errorMsg +="【单SKC畅滞系数必填,且不能小于或等于0】"; | |
} | |
if(skcDeepIndex==""){ | |
errorMsg +="【单SKC畅滞指数必填】"; | |
} | |
//主题款模块号必填 | |
if(commodityTypeKey=="S" && modNumber==""){ | |
errorMsg +="【主题款的模块号必填】"; | |
} | |
if(errorMsg!=""){ | |
var msg = skcCategoryKeyName+"skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:"+errorMsg; | |
console.log(msg); | |
resultJSON.errors.push(msg); | |
} | |
//组货确认时,需要检查组货单价和调整深度必填 | |
if(finalDeep<=0 || price<=0){ | |
var msg = skcCategoryKeyName+"skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:调整深度和组货单价必填!"; | |
resultJSON.finalConfirmError.push(msg); | |
} | |
//计算look的skc数量,并记录到结果的json中 | |
//主题款,并且存在模块号 look检查需要跨品类汇总,记录look下的skc,以及计算skc数量,look数量 | |
if(commodityTypeKey && commodityTypeKey=="S" && modNumber && modNumber!=""){ | |
var modJSON = resultJSON[commodityTypeKey].mods[modNumber]; | |
if(!modJSON){ | |
//lookCount:look数量,skcCount:模块内skc数量, lookSKCCount:有look标记的skc数量 | |
resultJSON[commodityTypeKey].mods[modNumber] = {skcCount:0,lookCount:0,lookSKCCount:0,looks:{list:[]}}; | |
modJSON = resultJSON[commodityTypeKey].mods[modNumber]; | |
} | |
//记录模块的skc数量 | |
modJSON.skcCount = modJSON.skcCount+1; | |
if(look1 || look2 || look3 || look4 || look5 || look6){ | |
modJSON.lookSKCCount = modJSON.lookSKCCount+1; | |
} | |
var lookName = ""; | |
var lookArray = [look1,look2,look3,look4,look5,look6]; | |
var lookNameArray = ["look1","look2","look3","look4","look5","look6"]; | |
for(var i=0;i<6;i++){ | |
var lookA = lookArray[i]; | |
var lookAName = lookNameArray[i]; | |
if(lookA){ | |
if(!modJSON.looks.list.includes(lookAName)){ | |
modJSON.looks.list.push(lookAName); | |
modJSON.lookCount = modJSON.lookCount+1; | |
} | |
if(!modJSON.looks[lookAName]){ | |
modJSON.looks[lookAName]=[]; | |
modJSON.looks[lookAName].push(skcId) | |
}else{ | |
modJSON.looks[lookAName].push(skcId); | |
} | |
} | |
} | |
} | |
//如果是常销款或基本款, 同一个款内 SKC 要求: 按照款号汇总, | |
if(commodityTypeKey && commodityTypeKey=="R" || commodityTypeKey=="B"){ | |
//按照款式汇总skc数量 | |
var stylesJson = resultJSON[commodityTypeKey].styles; | |
if(stylesJson.list.includes(styleId)){ | |
stylesJson.skcCount[styleId]=stylesJson.skcCount[styleId]+1; | |
stylesJson.skcs[styleId].push(skcId);//记录一个款式下的skc | |
}else{ | |
stylesJson.skcCount[styleId]=1; | |
stylesJson.skcs[styleId] = [skcId]; | |
stylesJson.list.push(styleId); | |
} | |
} | |
//记录skc对象,用于后续组货取值和计算,其中calQty,calAmount为最后建议的深度和金额 | |
////styDeepIdx:styleDeepIndex,styDeepCoefficient:styleDeepCoefficient,skcDeepIndex:skcDeepIndex,skcDeepCoefficient:skcDeepCoefficient, | |
//字段含义说明: minQty=最低深度,minQtyD=D款大片款最低深度 initQty=初始深度 lookCalQty=计算look最低深度时的中间扣减值 | |
//calQty=建议深度 calAmount=建议金额 | |
var zhSCKObj = {"skcId": skcId,skcName:skcName,"skcCode":skcCode,"styleId":styleId,mcpId:url,categoryKey:skcCategoryKey,categoryKeyName:skcCategoryKeyName,commodityType:commodityType,commodityName:commodityName, | |
commodityTypeKey:commodityTypeKey,catId:category,catName:categoryName, midCatId:midCategory,midCatName:midCategoryName,productStyle:productStyle, | |
modNumber:modNumber,look1:look1,look2:look2,look3:look3,look4:look4,look5:look5,look6:look6,isLook:isLook, display:display,specialType:specialType,channelType:channelType,subCategory:subCategory,subCategoryName:subCategoryName, | |
lookName:lookName,displayName:displayName,specialTypeName:specialTypeName,channelTypeName:channelTypeName,isDStyle:isDStyle,isSpecialStyle:isSpecialStyle, | |
"price": price, mcpPrice:mcpPrice, "minQty": 0, "minQtyD":0, "initQty": initQty, lookCalQty:initQty,"initAmount":initAmount, "initAmountPct":0, "calQty": 0, "calAmount":0,"calAmountPct":0, | |
standardDeep:0,shopCoverCount:0, isMinQty:false, fixQty:fixQty,userFix:userFix, fixAmout:false,finalQty:finalDeep,finalAmount:finalAmount,finalDStyleAmout:finalDStyleAmout | |
}; | |
resultJSON.list[skcId]=zhSCKObj; //url-node | |
resultJSON.skcIds.push(skcId);//url index | |
var depth = (nodeObj.C8_MCP_AdjustingDepth == 0 ? nodeObj.C8_MCP_SuggestedDepth : nodeObj.C8_MCP_AdjustingDepth); | |
amount = amount + depth*price; | |
} | |
}); | |
resultJSON.amount = amount; | |
} | |
return resultJSON; | |
}; | |
//获取组货结果SKC对象,并将需要计算的属性字段重新存储, | |
//并按照商品层+品类+中品类进行分组存储 | |
//DStyle=D款和大片款 ChannelSKC:==指定渠道款,SpecialSKC:特殊款 | |
function getAndGroupSKCDataHW(ac, resultURLs, controlRuleKeys) { | |
//Agnes 返回值新增弱管控品类信息 weakCategoryKey:{} | |
var resultJSON = {skcIds:[],list:{},skcs:{store:{}},minDeepRule3:[],prodCatSkcs:{},categoryKey:{},weakCategoryKey:{},errors:[],finalConfirmError:[], | |
"S":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[]}, | |
"R":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[],styles:{list:[],skcs:{},skcCount:{}}}, | |
"B":{categoryKey:[],mods:{},dSkcs:{},dCategoryKey:[],channelSKC:[],specialSKC:[],styles:{list:[],skcs:{},skcCount:{}}} | |
}; | |
var stylesList = []; | |
if(resultURLs && resultURLs.length>0){ | |
resultURLs.forEach(function(url,index){ | |
var nodeObj = getNode(ac,url); | |
if(nodeObj && nodeObj.$Type == "MCProduct"){ | |
if(nodeObj.C8_MCP_SKC == "centric:"){ | |
return; | |
} | |
var skcObj = getNode(ac,nodeObj.C8_MCP_SKC); | |
var skcName = skcObj.$Name; | |
var skcCode = skcObj.UR_Colorway_PLMUniqueValue; | |
var skcId = skcObj.$URL; | |
var styleNode = getNode(ac,skcObj.__Parent__); | |
var styleId = styleNode.$Name; | |
var styleAttNode = getNode(ac,styleNode.Attributes); | |
// miles 0119 获取系列用于后续判断是否是acc | |
var cat1Node = getNode(ac,styleNode.Category1); | |
//从Style和Attributes上获取字段信息 | |
var modNumber = styleNode.UR_Style_ModuleNumber;//模块号 | |
var priceStr = getEnumValue(styleAttNode.UR_StyleAttributes_GroupCarPrice); //组货单价 | |
var originalSeries = styleAttNode.UR_StyleAttributes_OriginalSeries; //子系列 | |
var price = 0; | |
if(priceStr && priceStr!=""){ | |
priceStr = priceStr.trim(); | |
price = parseInt(priceStr); | |
} | |
var mcpPrice = nodeObj.C8_MCP_Price; | |
var store = nodeObj.C8_MCP_StoreLevel; | |
var commodityType = styleNode.UR_Style_CommodityType;//商品层 | |
var commodityName = locale.getEnumName(commodityType);//商品层名称 | |
var commodityTypeKey = getEnumValue(commodityType); | |
var category = styleNode.UR_Style_ProductLargeType; //品类 | |
var categoryName = locale.getEnumName(category);//品类名称 | |
var midCategory = styleAttNode.UR_StyleAttributes_MiddleCategoryType;//UR_StyleAttributes_CategoryInPlan; //中品类 | |
var midCategoryName = locale.getEnumName(midCategory);//中品类名称 | |
var subCategory = styleAttNode.UR_StyleAttributes_Silhouette;//子品类、 | |
var subCategoryName = locale.getEnumName(subCategory);//子品类名称 | |
var productStyle = styleNode.UR_Style_ProductStyleCount;//风格 | |
//var productStyleName = locale.getEnumName(productStyle);//风格名称 | |
//productStyle = getEnumValue(productStyle);//风格key | |
var styleDeepCoefficient = styleNode.UR_Style_DepthCoefficient;//单款深度系数 double | |
var styleDeepIndex = styleNode.UR_Style_DepthIndex;//单款深度指数 enum | |
var styleDeepIndexValue = getEnumValue(styleDeepIndex); | |
var monthAvgDeep = styleNode.UR_Style_MonthAvgDepth;//月平均深度,参考值 | |
//从SKC上获取字段信息 | |
var skcDeepIndex = getEnumValue(skcObj.UR_CW_BestBadIndex);//单SKC畅滞指数 | |
var skcDeepCoefficient = skcObj.UR_CW_BestBadCoefficient;//单SKC畅滞系数 | |
var look1 = skcObj.UR_Colorway_Look1;//Look1 boolean | |
var look2 = skcObj.UR_Colorway_Look2;//Look2 boolean | |
var look3 = skcObj.UR_Colorway_Look3;//Look3 boolean | |
var look4 = skcObj.UR_Colorway_Look4;//Look4 boolean | |
var look5 = skcObj.UR_Colorway_Look5;//Look5 boolean | |
var look6 = skcObj.UR_Colorway_Look6;//Look6 boolean | |
var initQty = skcObj.C8_CW_InitialSKCDepth; //初始深度,改值已经经过款式深度指数*skc畅滞指数*款式平均深度 | |
//var calInitQty = parseInt(styleDeepCoefficient*skcDeepCoefficient*monthAvgDeep); | |
var changeInitQty = false; | |
//if(calInitQty != initQty){ | |
// changeInitQty = true;//此处为防呆处理,如果skc上的初始深度没有经过计算,此处记录,后续组货完成后更新skc的初始组货深度。 | |
// initQty = calInitQty; | |
//} | |
var fixQty = false; | |
var finalDeep = nodeObj.C8_MCP_AdjustingDepth;//获取用户填写的调整深度 | |
var finalDStyleAmout = nodeObj.C8_MCP_DExcessAmount; | |
var finalAmount = finalDeep*price; | |
var userFix = nodeObj.C8_MCP_SKCLock; | |
if(userFix){ | |
fixQty = true; | |
initQty = finalDeep; | |
} | |
//初始组货金额 | |
var initAmount = initQty*price; | |
//陈列、橱窗、渠道款,任意有值,则为特殊款 | |
var look = skcObj.C8_CW_MainPromotion;// styleNode.UR_Style_Look;//主推款 | |
var isLook = false; | |
var lookName = locale.getEnumName(look); | |
var display = skcObj.C8_CW_DisplayType;//陈列类型 | |
var displayName = locale.getEnumName(display); | |
var specialType = skcObj.C8_CW_Special;//特殊款类型 D款,大片款,英雄款 | |
var specialTypeName = locale.getEnumName(specialType); | |
var channelType = skcObj.C8_CW_NSStyle;//指定渠道类型 | |
var channelTypeName = locale.getEnumName(channelType); | |
var isChannelStyle = getEnumValue(channelType)==""?false:true; | |
var isDisplayStyle = getEnumValue(display)==""?false:true; | |
var isDStyle = getEnumValue(specialType)=="trailer_dedicated"||getEnumValue(specialType)=="SD"; | |
var isSpecialStyle = false; | |
//主题款记录特殊款类型,后续分别计算最低深度 | |
if(commodityTypeKey){ | |
//是否特殊款,用于后续金额归靠时,优先锁定特殊款金额 | |
if(look1 || look2 || look3 || look4 || look5 || look6){ | |
isLook = true; | |
} | |
//非D款和大片款的特殊款 | |
if( isLook|| (specialTypeName != "" && !isDStyle) || isChannelStyle || isDisplayStyle){ | |
isSpecialStyle = true; //非D款和大片款,同时是特殊款 | |
} | |
//渠道款 | |
if(isChannelStyle){ | |
resultJSON[commodityTypeKey].channelSKC.push(skcId); | |
} | |
//D款和大片款 - 按照表3计算最低深度 | |
//将D款,大片款,特殊款放到一个组中,用于按照规则表3计算最低深度 | |
if(isSpecialStyle || isDStyle){ | |
resultJSON.minDeepRule3.push(skcId);//其中包含了常销款和基本款的D款和大片款的情况 | |
} | |
} | |
//中品类映射转换 | |
var midCatKey = getEnumValue(midCategory); | |
if(midCatMapping.has(midCatKey)){ | |
midCatKey = midCatMapping.get(midCatKey); | |
} | |
//Agnes: 品类管控变更 拼接skc的管控key 品类_中品类_子品类_级别,并对比弱管控key | |
var skcControlKey = getEnumValue(category)+midCatKey+getEnumValue(subCategory) + getEnumValue(nodeObj.C8_MCP_SuggestedLevel); | |
var skcWeakControlKey = "";//skc弱管控品类key | |
var skcWeakControlKeyName = ""; | |
var skcCategoryKey = ""; | |
var skcCategoryKeyName =""; | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){//弱管控品类,skcCategoryKey只需要到品类,并生成弱管控品类key | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category); | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】"; | |
//if (cat1Node.$Name == "UR_ACC"){//区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
//skcWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+getEnumValue(subCategory); | |
skcWeakControlKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】"; | |
//}else{ | |
skcWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey | |
skcWeakControlKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
//} | |
}else {//原来的逻辑 | |
//存储categoryKey,用于后续组货计算 // miles 0119 区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
//if (cat1Node.$Name == "UR_ACC"){ | |
// skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+getEnumValue(subCategory); | |
// skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】【"+locale.getEnumName(subCategory)+"】"; | |
//}else{ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
//} | |
} | |
if(!resultJSON.categoryKey[skcCategoryKey]){ | |
resultJSON.categoryKey[skcCategoryKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
//记录每个品类的skc数量,用于后续宽度计算(常销款,基本款) | |
resultJSON.categoryKey[skcCategoryKey].skcs=resultJSON.categoryKey[skcCategoryKey].skcs+1;//skc数加1 | |
//新增记录每个大品类的SKC数量汇总 用于后续宽度计算 | |
var prodCatKey = getEnumValue(commodityType)+getEnumValue(category); | |
if(!resultJSON.prodCatSkcs[prodCatKey]){ | |
resultJSON.prodCatSkcs[prodCatKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
resultJSON.prodCatSkcs[prodCatKey].skcs=resultJSON.prodCatSkcs[prodCatKey].skcs+1;//skc数加1 | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.categoryKey[skcCategoryKey].styles=resultJSON.categoryKey[skcCategoryKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.categoryKey[skcCategoryKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.categoryKey[skcCategoryKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
//D款大片款组货金额-超出金额 | |
var currentFinalDStyleAmout = resultJSON.categoryKey[skcCategoryKey].finalDStyleAmout; | |
currentFinalDStyleAmout += finalDStyleAmout; | |
resultJSON.categoryKey[skcCategoryKey].finalDStyleAmout = currentFinalDStyleAmout; | |
//组货金额,组货深度 | |
resultJSON.categoryKey[skcCategoryKey].finalQty = currentFinalQty; | |
resultJSON.categoryKey[skcCategoryKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.categoryKey[skcCategoryKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
if(skcWeakControlKey != ""){//弱管控品类时保存弱管控品类数据 | |
if(!resultJSON.weakCategoryKey[skcWeakControlKey]){ | |
resultJSON.weakCategoryKey[skcWeakControlKey]={skcs:0,styles:0,list:[],hylist:[],finalQty:0,finalAmount:0,AvgPrice:0,finalDStyleAmout:0}; | |
} | |
//记录每个品类的skc数量,用于后续宽度计算(常销款,基本款) | |
resultJSON.weakCategoryKey[skcWeakControlKey].skcs=resultJSON.weakCategoryKey[skcWeakControlKey].skcs+1;//skc数加1 | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].styles=resultJSON.weakCategoryKey[skcWeakControlKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.weakCategoryKey[skcWeakControlKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.weakCategoryKey[skcWeakControlKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
//D款大片款组货金额-超出金额 | |
var currentFinalDStyleAmout = resultJSON.weakCategoryKey[skcWeakControlKey].finalDStyleAmout; | |
currentFinalDStyleAmout += finalDStyleAmout; | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalDStyleAmout = currentFinalDStyleAmout; | |
//组货金额,组货深度 | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalQty = currentFinalQty; | |
resultJSON.weakCategoryKey[skcWeakControlKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
} | |
//获取海外的数据值 | |
//1.深度 | |
var storeVolumnMap = new Map(Object.entries(nodeObj.C8_MCP_AdjustingDepthHy));//C8_MCP_StoreLevel | |
var storeKey = ""; | |
var storeWeakControlKey = ""; | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){//汇总到品类生成storeKey | |
storeKey = getEnumValue(commodityType)+getEnumValue(category); | |
storeWeakControlKey = getEnumValue(commodityType)+getEnumValue(category)+getEnumValue(midCategory); | |
}else{ | |
storeKey = getEnumValue(commodityType)+getEnumValue(category)+getEnumValue(midCategory); | |
} | |
var hylist = []; | |
var weakHyList = []; | |
var weakVolumnMap = new Map(); | |
var volumnMap = new Map(); | |
var resValue = 0; | |
var catKey = ""; | |
var weakCatKey = ""; | |
for (const [key, value] of storeVolumnMap) { | |
catKey = storeKey + key; | |
if(volumnMap.hasOwnProperty(catKey+"volumn")){ | |
resValue = volumnMap.get(catKey+"volumn") + value; | |
}else{ | |
resValue = value; | |
skcValue = value; | |
} | |
volumnMap.set(catKey+"volumn",resValue); | |
if(!resultJSON.categoryKey[catKey]){ | |
resultJSON.categoryKey[catKey]={skcs:0}; | |
} | |
if(resValue != 0){ | |
resultJSON.categoryKey[catKey].skcs=resultJSON.categoryKey[catKey].skcs+1;//skc数加1 | |
} | |
} | |
hylist.push(volumnMap); | |
if(storeWeakControlKey != "") { //存储海外弱管控数据 | |
for (const [key, value] of storeVolumnMap) { | |
weakCatKey = storeWeakControlKey + key; | |
if(weakVolumnMap.hasOwnProperty(weakCatKey+"volumn")){ | |
resValue = weakVolumnMap.get(weakCatKey+"volumn") + value; | |
}else{ | |
resValue = value; | |
skcValue = value; | |
} | |
weakVolumnMap.set(weakCatKey+"volumn",resValue); | |
if(!resultJSON.weakCategoryKey[weakCatKey]){ | |
resultJSON.weakCategoryKey[weakCatKey]={skcs:0}; | |
} | |
if(resValue != 0){ | |
resultJSON.weakCategoryKey[weakCatKey].skcs=resultJSON.weakCategoryKey[weakCatKey].skcs+1;//skc数加1 | |
} | |
} | |
weakHyList.push(weakVolumnMap); | |
} | |
//2.企划金额 | |
if(null != nodeObj.C8_MCP_AdjustingAmountHy) { | |
var amountMap = new Map(Object.entries(nodeObj.C8_MCP_AdjustingAmountHy)); | |
//var amountKey = getEnumValue(commodityType)+getEnumValue(category);//+getEnumValue(midCategory) | |
var priceMap = new Map(); | |
var weakPriceMap = new Map(); | |
var resValue = 0; | |
for (const [key, value] of amountMap) { | |
catKey = storeKey + key; | |
if (priceMap.hasOwnProperty(catKey + "price")) { | |
resValue = priceMap.get(catKey + "price") + value; | |
} else { | |
resValue = value; | |
} | |
priceMap.set(catKey + "price", resValue); | |
} | |
hylist.push(priceMap); | |
resultJSON.categoryKey[skcCategoryKey].hylist.push(hylist); | |
if (storeWeakControlKey != "") { //存储海外弱管控数据 | |
for (const [key, value] of amountMap) { | |
weakCatKey = storeWeakControlKey + key; | |
if (weakPriceMap.hasOwnProperty(weakCatKey + "price")) { | |
resValue = weakPriceMap.get(weakCatKey + "price") + value; | |
} else { | |
resValue = value; | |
} | |
weakPriceMap.set(weakCatKey + "price", resValue); | |
} | |
} | |
weakHyList.push(weakPriceMap); | |
} | |
//记录每个分类下的skcId | |
resultJSON.categoryKey[skcCategoryKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
if(controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4))){ | |
resultJSON.weakCategoryKey[skcWeakControlKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
} | |
//单独记录,用于一起组货计算 | |
if(!resultJSON["skcs"][skcCategoryKey]){ | |
resultJSON["skcs"][skcCategoryKey]=[]; | |
} | |
resultJSON["skcs"][skcCategoryKey].push(skcId);//按照key存储id到各自分类下 | |
//if(!controlRuleKeys.has(skcControlKey) && !controlRuleKeys.has(skcControlKey.substring(0, 4))){//强管控品类才记录进来 | |
//在按照商品层分类下分别记录各自的categoryKey | |
if(!resultJSON[commodityTypeKey]["categoryKey"].includes(skcCategoryKey)){ | |
resultJSON[commodityTypeKey]["categoryKey"].push(skcCategoryKey); | |
} | |
//单独记录D款和大片款 | |
if(isDStyle){ | |
if(!resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey]){ | |
resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey]=[]; | |
} | |
resultJSON[commodityTypeKey]["dSkcs"][skcCategoryKey].push(skcId);//按照key存储id到各自分类下 | |
//在按照商品层分类下分别记录各自的categoryKey | |
if(!resultJSON[commodityTypeKey]["dCategoryKey"].includes(skcCategoryKey)){ | |
resultJSON[commodityTypeKey]["dCategoryKey"].push(skcCategoryKey); | |
} | |
} | |
//} | |
//检查style和skc上的指数和系数是否填写 | |
var errorMsg = ""; | |
if(price==0){ | |
errorMsg +="【组货单价等于0】"; | |
} | |
if(styleDeepCoefficient<=0){ | |
errorMsg +="【单款深度系数必填,且不能小于或等于0】"; | |
} | |
if(styleDeepIndexValue==""){ | |
errorMsg +="【单款深度指数必填】"; | |
} | |
if(skcDeepCoefficient<=0){ | |
errorMsg +="【单SKC畅滞系数必填,且不能小于或等于0】"; | |
} | |
if(skcDeepIndex==""){ | |
errorMsg +="【单SKC畅滞指数必填】"; | |
} | |
//主题款模块号必填 | |
if(commodityTypeKey=="S" && modNumber==""){ | |
errorMsg +="【主题款的模块号必填】"; | |
} | |
if(errorMsg!=""){ | |
var msg = skcCategoryKeyName+"skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:"+errorMsg; | |
console.log(msg); | |
resultJSON.errors.push(msg); | |
} | |
//组货确认时,需要检查组货单价和调整深度必填 | |
if(finalDeep<=0 || price<=0){ | |
var msg = skcCategoryKeyName+"skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:调整深度和组货单价必填!"; | |
resultJSON.finalConfirmError.push(msg); | |
} | |
//计算look的skc数量,并记录到结果的json中 | |
//主题款,并且存在模块号 look检查需要跨品类汇总,记录look下的skc,以及计算skc数量,look数量 | |
if(commodityTypeKey && commodityTypeKey=="S" && modNumber && modNumber!=""){ | |
var modJSON = resultJSON[commodityTypeKey].mods[modNumber]; | |
if(!modJSON){ | |
//lookCount:look数量,skcCount:模块内skc数量, lookSKCCount:有look标记的skc数量 | |
resultJSON[commodityTypeKey].mods[modNumber] = {skcCount:0,lookCount:0,lookSKCCount:0,looks:{list:[]}}; | |
modJSON = resultJSON[commodityTypeKey].mods[modNumber]; | |
} | |
//记录模块的skc数量 | |
modJSON.skcCount = modJSON.skcCount+1; | |
if(look1 || look2 || look3 || look4 || look5 || look6){ | |
modJSON.lookSKCCount = modJSON.lookSKCCount+1; | |
} | |
var lookName = ""; | |
var lookArray = [look1,look2,look3,look4,look5,look6]; | |
var lookNameArray = ["look1","look2","look3","look4","look5","look6"]; | |
for(var i=0;i<6;i++){ | |
var lookA = lookArray[i]; | |
var lookAName = lookNameArray[i]; | |
if(lookA){ | |
if(!modJSON.looks.list.includes(lookAName)){ | |
modJSON.looks.list.push(lookAName); | |
modJSON.lookCount = modJSON.lookCount+1; | |
} | |
if(!modJSON.looks[lookAName]){ | |
modJSON.looks[lookAName]=[]; | |
modJSON.looks[lookAName].push(skcId) | |
}else{ | |
modJSON.looks[lookAName].push(skcId); | |
} | |
} | |
} | |
} | |
//如果是常销款或基本款, 同一个款内 SKC 要求: 按照款号汇总, | |
if(commodityTypeKey && commodityTypeKey=="R" || commodityTypeKey=="B"){ | |
//按照款式汇总skc数量 | |
var stylesJson = resultJSON[commodityTypeKey].styles; | |
if(stylesJson.list.includes(styleId)){ | |
stylesJson.skcCount[styleId]=stylesJson.skcCount[styleId]+1; | |
stylesJson.skcs[styleId].push(skcId);//记录一个款式下的skc | |
}else{ | |
stylesJson.skcCount[styleId]=1; | |
stylesJson.skcs[styleId] = [skcId]; | |
stylesJson.list.push(styleId); | |
} | |
} | |
//记录skc对象,用于后续组货取值和计算,其中calQty,calAmount为最后建议的深度和金额 | |
////styDeepIdx:styleDeepIndex,styDeepCoefficient:styleDeepCoefficient,skcDeepIndex:skcDeepIndex,skcDeepCoefficient:skcDeepCoefficient, | |
//字段含义说明: minQty=最低深度,minQtyD=D款大片款最低深度 initQty=初始深度 lookCalQty=计算look最低深度时的中间扣减值 | |
//calQty=建议深度 calAmount=建议金额 | |
var zhSCKObj = {"skcId": skcId,skcName:skcName,"skcCode":skcCode,"styleId":styleId,"originalSeries":originalSeries,mcpId:url,categoryKey:skcCategoryKey,categoryKeyName:skcCategoryKeyName,commodityType:commodityType,commodityName:commodityName, | |
commodityTypeKey:commodityTypeKey,catId:category,catName:categoryName, midCatId:midCategory,midCatName:midCategoryName,productStyle:productStyle, | |
modNumber:modNumber,look1:look1,look2:look2,look3:look3,look4:look4,look5:look5,look6:look6,isLook:isLook, display:display,specialType:specialType,channelType:channelType,subCategory:subCategory,subCategoryName:subCategoryName, | |
lookName:lookName,displayName:displayName,specialTypeName:specialTypeName,channelTypeName:channelTypeName,isDStyle:isDStyle,isSpecialStyle:isSpecialStyle, | |
"price": price, mcpPrice:mcpPrice, store:store,"minQty": 0, "minQtyD":0, "initQty": initQty, lookCalQty:initQty,"initAmount":initAmount, "initAmountPct":0, "calQty": 0, "calAmount":0,"calAmountPct":0, | |
standardDeep:0,shopCoverCount:0, isMinQty:false, fixQty:fixQty,userFix:userFix, fixAmout:false,finalQty:finalDeep,finalAmount:finalAmount,finalDStyleAmout:finalDStyleAmout | |
}; | |
resultJSON.list[skcId]=zhSCKObj; //url-node | |
resultJSON.skcIds.push(skcId);//url index | |
} | |
}); | |
} | |
return resultJSON; | |
}; | |
//获取电商组货SKC信息,提前根据目标的key和skc的key进行分组 | |
function getDianShangGroupSKCData(ac, resultURLs, controlRuleKeys, isCheck) { | |
//Agnes 品类强弱管控 返回值新增weakCategoryKey:{} | |
//Agnes 新增品类汇总catCrossLevelKey记录品类跨等级汇总非Nskc数量以及总skc数量 | |
var resultJSON = {catCrossLevelKey:{},skcIds:[],list:{},categoryKey:{},weakCategoryKey:{},errors:[],finalConfirmError:[]}; | |
var stylesList = []; | |
if(resultURLs && resultURLs.length>0){ | |
//Agnes 20240409 新增单非N级别SKC数量统计 | |
var nonNSkcs = 0; | |
var commodityType = ""; | |
var amount = 0; | |
resultURLs.forEach(function(url,index){ | |
var nodeObj = getNode(ac,url); | |
if(nodeObj){ | |
var skcObj = getNode(ac,nodeObj.C8_MCP_SKC); | |
var skcName = skcObj.$Name; | |
var skcCode = skcObj.UR_Colorway_PLMUniqueValue; | |
var skcId = skcObj.$URL; | |
var styleNode = getNode(ac,skcObj.__Parent__); | |
var styleId = styleNode.$Name; | |
var styleAttNode = getNode(ac,styleNode.Attributes); | |
var dStyleSpecial = skcObj.C8_CW_DSSpecial;//D款 | |
var userFix = nodeObj.C8_MCP_SKCLock; | |
var isDStyle = getEnumValue(dStyleSpecial)=="SD"; | |
// miles 0119 获取系列用于后续判断是否是acc | |
var cat1Node = getNode(ac,styleNode.Category1); | |
//从Style和Attributes上获取字段信息 | |
var priceStr = getEnumValue(styleAttNode.UR_StyleAttributes_GroupCarPrice); //组货单价 | |
var price = 0; | |
if(priceStr && priceStr!=""){ | |
priceStr = priceStr.trim(); | |
price = parseInt(priceStr); | |
} | |
var mcpPrice = nodeObj.C8_MCP_Price; | |
commodityType = styleNode.UR_Style_CommodityType;//商品层 | |
var commodityName = locale.getEnumName(commodityType);//商品层名称 | |
var commodityTypeKey = getEnumValue(commodityType); | |
var category = styleNode.UR_Style_ProductLargeType; //品类 | |
var categoryName = locale.getEnumName(category);//品类名称 | |
var midCategory = styleAttNode.UR_StyleAttributes_MiddleCategoryType; //中品类 | |
var midCategoryName = locale.getEnumName(midCategory);//中品类名称 | |
var subCategory = styleAttNode.UR_StyleAttributes_Silhouette;//子品类、 | |
var subCategoryName = locale.getEnumName(subCategory);//子品类名称 | |
var productStyle = styleNode.UR_Style_ProductStyleCount;//风格 | |
var suggestClass = nodeObj.C8_MCP_SuggestedLevel;//建议级别 | |
var styleClassKey = getEnumValue(suggestClass); | |
var adjustClassKey = getEnumValue(nodeObj.C8_MCP_AdjustingLevel);//调整等级,检核时检验非Nskc比例用 | |
if(adjustClassKey != ""){ | |
styleClassKey = adjustClassKey; //调整级别不为空时使用调整级别 | |
} | |
if(styleClassKey != "N"){ | |
nonNSkcs = nonNSkcs + 1; | |
} | |
//检查建议级别是否填写 | |
var errorMsg = ""; | |
if(price==0){ | |
errorMsg +="【组货单价等于0】"; | |
} | |
if(styleClassKey==""){ | |
errorMsg +="【组货建议等级不能为空】"; | |
} | |
if(errorMsg!=""){ | |
var msg = "skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:"+errorMsg; | |
console.log(msg); | |
resultJSON.errors.push(msg); | |
} | |
var initQty = 0; //初始深度,周目标组货金额除以skc数量,得到平均每个skc的组货金额,组货金额除以单价,即为单款初始深度 | |
// if(isDStyle){ | |
// initQty = 10;//如果为D款,深度默认为10 | |
// } | |
var initAmount = initQty*price; | |
var finalDeep = nodeObj.C8_MCP_AdjustingDepth;//获取用户填写的调整深度 | |
var finalAmount = finalDeep*price; | |
//组货确认时,需要检查组货单价和调整深度必填 | |
if(finalDeep<=0 || price<=0){ | |
var msg = skcCategoryKeyName+"skc名称【"+skcName+"】唯一码【"+skcCode+"】数据校验错误:调整深度和组货单价必填!"; | |
resultJSON.finalConfirmError.push(msg); | |
} | |
//中品类映射转换 | |
var midCatKey = getEnumValue(midCategory); | |
if(midCatMapping.has(midCatKey)){ | |
midCatKey = midCatMapping.get(midCatKey); | |
} | |
//Agnes 拼接管控key 品类+中品类+子品类+级别 | |
var skcControlKey = getEnumValue(category) + midCatKey + getEnumValue(subCategory) + styleClassKey; | |
var skcCategoryKey = ""; | |
var skcCategoryKeyName = ""; | |
var weakSkcCatetoryKey = ""; | |
//新增跨电商等级品类key,不带子品类 | |
var catCrossLevelKey = commodityTypeKey + getEnumValue(category) + midCatKey; | |
//如果品类管控,则key到品类 | |
if(controlRuleKeys && (controlRuleKeys.has(skcControlKey) || controlRuleKeys.has(skcControlKey.substring(0, 4)))){ | |
if(isCheck){ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category); | |
}else{ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+styleClassKey; | |
} | |
//弱管控时 | |
catCrossLevelKey = commodityTypeKey + getEnumValue(category); | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】"; | |
if (cat1Node.$Name == "UR_ACC"){//区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
weakSkcCatetoryKey = getEnumValue(commodityType)+getEnumValue(category)+getEnumValue(subCategory)+styleClassKey; | |
}else{ | |
weakSkcCatetoryKey = getEnumValue(commodityType)+getEnumValue(category)+styleClassKey; | |
} | |
}else {//key不带子品类 Agnes 20240428 | |
//存储categoryKey,用于后续组货计算 // miles 0119 区分是否acc决定是否拼接子品类,防止与目标设置不匹配 | |
if (cat1Node.$Name == "UR_ACC"){ | |
if(isCheck){ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey; | |
}else{ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+styleClassKey; | |
} | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
weakSkcCatetoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey +styleClassKey; | |
}else{ | |
if(isCheck){ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey; | |
}else{ | |
skcCategoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+styleClassKey; | |
} | |
skcCategoryKeyName = "【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(category)+"】【"+locale.getEnumName(midCategory)+"】"; | |
weakSkcCatetoryKey = getEnumValue(commodityType)+getEnumValue(category)+midCatKey+styleClassKey; | |
} | |
} | |
if(!resultJSON.categoryKey[skcCategoryKey]){ | |
resultJSON.categoryKey[skcCategoryKey]={skcs:0,styles:0,list:[],finalQty:0,finalAmount:0,AvgPrice:0}; | |
} | |
if(!resultJSON.catCrossLevelKey[catCrossLevelKey]){ | |
//20240409 新增catNonNSkcs记录组货单上非N skc数量 | |
resultJSON.catCrossLevelKey[catCrossLevelKey]={catNonNSkcs:0,catSkcs:0}; | |
} | |
//20240409 新增catNonNSkcs记录组货单上非N skc数量 | |
if(styleClassKey != "N"){ | |
resultJSON.catCrossLevelKey[catCrossLevelKey].catNonNSkcs=resultJSON.catCrossLevelKey[catCrossLevelKey].catNonNSkcs+1;//catNonNSkcs数加1 | |
} | |
//品类跨层级skc数量加1 | |
resultJSON.catCrossLevelKey[catCrossLevelKey].catSkcs = resultJSON.catCrossLevelKey[catCrossLevelKey].catSkcs + 1; | |
//记录每个品类的skc数量 | |
resultJSON.categoryKey[skcCategoryKey].skcs=resultJSON.categoryKey[skcCategoryKey].skcs+1;//skc数加1 | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.categoryKey[skcCategoryKey].styles=resultJSON.categoryKey[skcCategoryKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
resultJSON.categoryKey[skcCategoryKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.categoryKey[skcCategoryKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.categoryKey[skcCategoryKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
resultJSON.categoryKey[skcCategoryKey].finalQty = currentFinalQty; | |
resultJSON.categoryKey[skcCategoryKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.categoryKey[skcCategoryKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
//记录弱管控数据 Agnes | |
if(weakSkcCatetoryKey != ""){ | |
if(!resultJSON.weakCategoryKey[weakSkcCatetoryKey]){ | |
resultJSON.weakCategoryKey[weakSkcCatetoryKey]={skcs:0,styles:0,list:[],finalQty:0,finalAmount:0,AvgPrice:0}; | |
} | |
//记录每个品类的skc数量 | |
resultJSON.weakCategoryKey[weakSkcCatetoryKey].skcs=resultJSON.weakCategoryKey[weakSkcCatetoryKey].skcs+1;//skc数加1 | |
//记录每个品类的styles数量,用于后续宽度计算(常销款,基本款) | |
if(!stylesList.includes(styleId)){ | |
resultJSON.weakCategoryKey[weakSkcCatetoryKey].styles=resultJSON.weakCategoryKey[weakSkcCatetoryKey].styles+1;//分类的款式数量加1 | |
stylesList.push(styleId); | |
} | |
resultJSON.weakCategoryKey[weakSkcCatetoryKey].list.push(skcId);//skc添加到对应的categoryKey中 | |
//计算对应key的汇总深度,汇总金额,平均价,作为后续检核时直接进行校验 | |
var currentFinalQty = resultJSON.weakCategoryKey[weakSkcCatetoryKey].finalQty; | |
currentFinalQty += finalDeep; | |
var currentFinalAmount = resultJSON.weakCategoryKey[weakSkcCatetoryKey].finalAmount; | |
currentFinalAmount += finalAmount; | |
resultJSON.weakCategoryKey[weakSkcCatetoryKey].finalQty = currentFinalQty; | |
resultJSON.weakCategoryKey[weakSkcCatetoryKey].finalAmount = currentFinalAmount; | |
if(currentFinalQty!=0){ | |
resultJSON.weakCategoryKey[weakSkcCatetoryKey].AvgPrice = currentFinalAmount/currentFinalQty; | |
} | |
} | |
//记录skc对象 | |
var zhSCKObj = {"skcId": skcId,skcName:skcName,"skcCode":skcCode,"styleId":styleId,mcpId:url,categoryKey:skcCategoryKey,categoryKeyName:skcCategoryKeyName,commodityType:commodityType,commodityName:commodityName,subCategory:subCategory,subCategoryName:subCategoryName, | |
commodityTypeKey:commodityTypeKey,catId:category,catName:categoryName, midCatId:midCategory,midCatName:midCategoryName,productStyle:productStyle, | |
"price": price,mcpPrice:mcpPrice, "minQty": 0, "initQty": initQty, "initAmount":initAmount, "suggestClass":suggestClass,styleClassKey:styleClassKey,isDStyle:isDStyle, | |
isMinQty:false, fixQty:false, userFix:userFix,fixAmout:false,finalQty:finalDeep,finalAmount:finalAmount | |
}; | |
resultJSON.list[skcId]=zhSCKObj; //url-node | |
resultJSON.skcIds.push(skcId);//url index | |
//记录累计金额 | |
amount = amount + finalAmount; | |
} | |
}); | |
resultJSON.nonNSkcs = nonNSkcs; | |
resultJSON.commodityType = commodityType; | |
resultJSON.amount = amount; | |
} | |
return resultJSON; | |
}; | |
//根据rule规则,判断值是否符合规则要求 | |
//lookCount(int),rule(string),skcCount(string) | |
//允许规则:rule("gte","gt","eq","lte","lt","range") | |
//当Rule=range时,skcCount: 1,2,3 或 1-9,或 2,3,5-8,11 | |
function checkModSKCCount(lookCount,rule,skcCount){ | |
var check = false; | |
var rules = ["gte","gt","eq","lte","lt"]; | |
if(skcCount){ | |
skcCount = skcCount.trim(); | |
}else{ | |
skcCount = "-1"; | |
} | |
if(rules.includes(rule)){ | |
var skcCountInt = parseInt(skcCount); | |
if(rule=="gte"){ | |
check = lookCount>=skcCountInt; | |
}else if(rule=="gt"){ | |
check =lookCount>skcCountInt; | |
}else if(rule=="eq"){ | |
check =lookCount==skcCountInt; | |
}else if(rule=="lte"){ | |
check =lookCount<=skcCountInt; | |
}else if(rule=="lt"){ | |
check =lookCount<skcCountInt; | |
} | |
}else if(rule=="range"){//满足任意条件即可 | |
var skcCountInt = 0; | |
skcCount = skcCount.replaceAll("、",",").replaceAll(",",",").replaceAll("|",","); | |
if(skcCount.indexOf(",")>=0){ | |
var countArr = skcCount.split(","); | |
countArr.forEach(function(countStr){ | |
countStr = countStr.trim(); | |
if(countStr.indexOf("-")>0){ | |
var rangeArr = countStr.split("-"); | |
if(rangeArr[0]!="" && rangeArr[1]!=""){ | |
var lowerInt = parseInt(rangeArr[0].trim()); | |
var upperInt = parseInt(rangeArr[1].trim()); | |
if(lookCount>=lowerInt && lookCount<=upperInt){ | |
check = true; | |
} | |
} | |
}else{ | |
var countInt = parseInt(countStr); | |
if(lookCount == countInt){ | |
check = true; | |
} | |
} | |
}); | |
} | |
} | |
return check; | |
} | |
//根据特殊值过滤取最大 | |
function getRuleTableMax(ruleNodes/*nodes[]*/,field/*string*/,filterField/*string*/,filterGroup/*string[]*/){ | |
var max = -9999999; | |
ruleNodes.forEach(function(ruleNode){ | |
var filterValue = getEnumValue(ruleNode[filterField]); | |
if(filterGroup.includes(filterValue)){ | |
if(max<ruleNode[field]){ | |
max = ruleNode[field]; | |
} | |
} | |
}); | |
return max; | |
} | |
//计算每个skc金额,汇总金额,计算平均占比 | |
//如果skc已经被用户锁定,则把金额扣除,并且从skc数组中去掉 | |
function sumInitAmount(skcsList,qtyAtt,amountAtt,pctAtt,skcsData){ | |
var total = 0;//总金额 | |
var newSKCsList = [];//非锁定的skc列表,用于后续计算 | |
var fixedTotal = 0; //用户锁定的金额 | |
skcsList.forEach(function(skcId){ | |
var node = skcsData.list[skcId]; | |
var userFix = node.userFix; | |
if(!userFix){ | |
node[amountAtt]=node.price*node[qtyAtt]; | |
total += node[amountAtt]; | |
newSKCsList.push(node.skcId); | |
}else{ | |
node[amountAtt]=node.price*node[qtyAtt]; | |
fixedTotal += node[amountAtt]; | |
total += node[amountAtt]; | |
} | |
}); | |
//计算占比 | |
if(pctAtt && total>0){ | |
newSKCsList.forEach(function(skcId){ | |
var node = skcsData.list[skcId]; | |
node[pctAtt]=node[amountAtt]/total; | |
}); | |
} | |
return {total:total,newSKCsList:newSKCsList,fixedTotal:fixedTotal}; | |
} | |
//缩小金额到目标金额 | |
//scalePct=初始缩放比例,,skcsList,targetAmount=目标金额,totalScaleAmount=初始目标减掉金额 | |
function scaleSKCs(scalePct,skcsList,sumAmount,targetAmount,skcsData,adjustQty){ | |
//考虑防呆,最多只计算200次以内 每单组货按品类划分后应该小于100 | |
var maxRunTime = 200; | |
var runTime = 0; | |
var scaleSumAmount = sumAmount; | |
var currentScalePct = scalePct; | |
var success = true; | |
var errorMsg = ""; | |
while(scaleSumAmount>targetAmount){ | |
runTime++; | |
printLog("\t 缩放金额第【"+runTime+"】次 scaleSumAmount="+scaleSumAmount+" targetAmount="+targetAmount); | |
//检查特殊款缩放后如果有超出,则优先扣减金额到最低深度,然后锁定 | |
var hasOverMinQty = getSpecialExceedMinQtySkcs(currentScalePct,skcsList,skcsData,adjustQty); | |
//如果没有特殊款缩放后低于最低深度,则全部skc按照比例缩放,需要按照非锁定的skc进行缩放 | |
var sumResult = sumSKCAmount(skcsList,skcsData); | |
var nonFixedAmount = sumResult.nonFixedAmount; | |
var fixedAmount = sumResult.fixedAmount; | |
scaleSumAmount = sumResult.totalSumAmount; | |
var targetDeduceAmount = scaleSumAmount - targetAmount; | |
printLog("\t 缩放金额第【"+runTime+"】次 锁定特殊款最低深度 hasOverMinQty="+hasOverMinQty+" nonFixedAmount="+nonFixedAmount); | |
if(nonFixedAmount<=0){ | |
errorMsg = "非锁定的SKC金额不足以扣减金额,数据存在错误,请检查!"; | |
printLog("\t "+errorMsg); | |
success = false; | |
break; | |
} | |
//重新计算缩放比例 | |
currentScalePct = 1-(targetDeduceAmount/nonFixedAmount); | |
printLog("\t 缩放金额第【"+runTime+"】次 scaleSumAmount="+scaleSumAmount); | |
printLog("\t 缩放金额第【"+runTime+"】次 nonFixedAmount="+nonFixedAmount); | |
printLog("\t 缩放金额第【"+runTime+"】次 fixedAmount="+fixedAmount); | |
printLog("\t 缩放金额第【"+runTime+"】次 currentScalePct="+currentScalePct); | |
if(!hasOverMinQty){ | |
printLog("\t 缩放金额第【"+runTime+"】次 特殊款均已锁定="+currentScalePct); | |
if(nonFixedAmount>0 && nonFixedAmount>targetDeduceAmount){ | |
scaleSumAmount = scaleAmount(currentScalePct,skcsList,skcsData,false,adjustQty); | |
printLog("\t 缩放金额第【"+runTime+"】次 缩放完成="+scaleSumAmount); | |
break; | |
}else if(nonFixedAmount>0 && nonFixedAmount<targetDeduceAmount){ | |
printLog("\t 非锁定的SKC金额不足以扣减金额,采用全部扣减的方式,无论是否特殊款,是否锁定"); | |
currentScalePct = 1-(targetDeduceAmount/scaleSumAmount); | |
printLog("\t 非锁定的SKC金额不足以扣减金额,采用全部扣减的方式,无论是否特殊款,是否锁定"); | |
scaleSumAmount = scaleAmount(currentScalePct,skcsList,skcsData,true,adjustQty); | |
break; | |
}else{ | |
printLog("\t 非锁定的SKC金额不足以扣减金额,数据存在错误,请检查!"); | |
success = false; | |
break; | |
} | |
} | |
//防呆退出 | |
if(runTime>maxRunTime){ | |
break; | |
} | |
} | |
return {scaleAmount:scaleSumAmount,success:success,errMsg:errorMsg}; | |
} | |
//计算将initQty缩小后 不考虑最低深度的缩放 includeFixed=是否包含锁定项 | |
function scaleAmount(scalePct,skcsList,skcsData,includeFixed,adjustQty){ | |
var totalSumAmount = 0;//扣减后总金额 | |
var totalMaxScaleAmount = 0; | |
var hasOverMinQty = false; | |
//var adjustQty = 0; | |
skcsList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
var initQty = skcNode.initQty; | |
var price = skcNode.price; | |
var isFixed = skcNode.fixQty; | |
var userFix = skcNode.userFix; | |
//scalePct = scalePct.toFixed(4); | |
//精度处理 | |
// if(0.9 < scalePct && scalePct < 1.1){ | |
// scalePct = scalePct; | |
// }else{ | |
// if(scalePct > 1.1){ | |
// scalePct = scalePct - 0.01; | |
// }else{ | |
// scalePct = scalePct + 0.01; | |
// } | |
// } | |
// if(scalePct>1){ | |
// adjustQty = 2; | |
// }else if(scalePct==1){ | |
// adjustQty = 0; | |
// }else{ | |
// adjustQty = -2; | |
// } | |
if(includeFixed && !userFix){ | |
initQty = parseInt(initQty*scalePct)+adjustQty; | |
var scaleAmount = initQty * price; | |
skcNode.initQty = initQty; | |
skcNode.initAmount = scaleAmount; | |
totalSumAmount += scaleAmount; | |
}else{ | |
if(!isFixed){ | |
initQty = parseInt(initQty*scalePct)+adjustQty; | |
var scaleAmount = initQty * price; | |
skcNode.initQty = initQty; | |
skcNode.initAmount = scaleAmount; | |
totalSumAmount += scaleAmount; | |
}else{ | |
var scaleAmount = initQty * price; | |
totalSumAmount += scaleAmount; | |
} | |
} | |
}); | |
return parseInt(totalSumAmount); | |
} | |
//计算将initQty缩小后,是否低于最小深度 | |
function getSpecialExceedMinQtySkcs(scalePct,skcsList,skcsData,adjustQty){ | |
var totalSumAmount = 0;//扣减后总金额 | |
var totalMaxScaleAmount = 0; | |
var retNode = {hasOverMinQty:false,sumAmount:0}; | |
var hasOverMinQty = false; | |
for(var i=0;i<skcsList.length;i++){ | |
var skcNode = skcsData.list[skcsList[i]]; | |
var skcName = skcNode.skcName; | |
var minQty = skcNode.minQty; | |
var initQty = skcNode.initQty; | |
var price = skcNode.price; | |
var fixed = skcNode.fixQty; | |
var isSpecialStyle = skcNode.isSpecialStyle; //非D款和大片款, 特殊值有值 | |
if(isSpecialStyle && !fixed){ | |
if(initQty>minQty){ | |
var scaleQty = parseInt(initQty*scalePct)+adjustQty; | |
if(scaleQty<minQty){ | |
var msg = "\tskc【"+skcName+"】的初始深度为【"+initQty+"】,如果缩放【"+scalePct*100+"%】后,sacleQty=" | |
+ scaleQty+" 小于最低深度【"+minQty+"】,锁定该SKC的深度为最小深度" | |
printLog(msg); | |
skcNode.initQty = minQty; | |
skcNode.initAmount = minQty*price; | |
skcNode.fixQty = true; | |
hasOverMinQty = true; | |
break;//一次只锁定一个特殊款 | |
} | |
}else{ | |
skcNode.initQty = minQty; | |
skcNode.initAmount = minQty*price; | |
skcNode.fixQty = true; | |
hasOverMinQty = true;//继续循环 | |
break;//一次只锁定一款 | |
} | |
} | |
} | |
//记录结果 | |
return hasOverMinQty; | |
} | |
//汇总总金额 | |
// return {totalSumAmount:总金额,fixedAmount:已锁定总金额,nonFixedAmount:未锁定总金额,avgPrice:平均价,totalQty:总深度}; | |
function sumSKCAmount(skcsList,skcsData){ | |
var totalSumAmount = 0;//扣减后总金额 | |
var fixedAmount = 0; | |
var nonFixedAmount = 0; | |
var avgPrice = 0; | |
var totalQty = 0; | |
skcsList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
var initQty = skcNode.initQty; | |
var price = skcNode.price; | |
var isFixed = skcNode.fixQty; | |
totalQty += initQty; | |
if(!isFixed){ | |
nonFixedAmount += initQty*price; | |
totalSumAmount += initQty*price; | |
}else{ | |
fixedAmount += initQty*price; | |
totalSumAmount += initQty*price; | |
} | |
}); | |
if(totalQty>0){ | |
avgPrice = totalSumAmount/totalQty; | |
} | |
return {totalSumAmount:totalSumAmount,fixedAmount:fixedAmount,nonFixedAmount:nonFixedAmount,avgPrice:avgPrice,totalQty:totalQty}; | |
} | |
//获取用于平均价挂靠的,非用户冻结的skc清单 | |
function getNonUserFixedList(sortSkcsPriceList,skcsData){ | |
var nonFixedList = []; | |
sortSkcsPriceList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
var isFixed = skcNode.userFix; | |
if(!isFixed){ | |
nonFixedList.push(skcNode.skcId); | |
} | |
}); | |
return nonFixedList; | |
} | |
//提高平均价到目标平均价 | |
////平均价比较低,所以需要增加大于平均价的的skc的深度,同时减少低于平均价的skc的深度,此时总金额可能呈现上升趋势 | |
function scaleUpAvgPrice(sortSkcsPriceList,calSkcList,skcsData,avgPrice,avgPriceDown,sumAmount,minAmount,maxAmount,currentRunTime,adjustQty){ | |
if(currentRunTime>500){ | |
return avgPrice; | |
} | |
printLog("提高平均价计算:currentRunTime="+currentRunTime+" currentAvgPrice="+avgPrice+" target="+avgPriceDown+" sumAmount="+sumAmount+" minAmount="+minAmount+" maxAmount="+maxAmount); | |
var size = calSkcList.length; | |
var avgPriceIndex = getAvgPriceIndex(calSkcList,avgPriceDown,skcsData);//获取平均价对应的数组索引号,用于判断成对的用于扣减和增加深度的组合数 | |
var isOK = false; | |
var fixQtyList = []; | |
var currentAvgPrice = avgPrice; | |
var currentSumAmount = sumAmount; | |
var currentAdjustQty = adjustQty;//当汇总金额小于最低时,adjustQty设置为1,每次增加高价格SKC时,低价格SKC少扣减一个,使得金额总体上升 | |
printLog("计算的平均价索引位置avgPriceIndex="+avgPriceIndex); | |
for(var i=0;i<avgPriceIndex;i++){ | |
var firstSKC = skcsData.list[calSkcList[i]]; | |
var lastSKC = skcsData.list[calSkcList[size-i-1]]; | |
var firstPrice = firstSKC.price; | |
var lastPrice = lastSKC.price; | |
var rate = 0;//计算扣减比率 | |
if(lastPrice!=0) | |
rate = parseInt(firstPrice/lastPrice); | |
//如果数量不够扣减,则不扣减,直接锁定skc | |
printLog("\t计算"+i+"次:"+" rate="+rate+" firstSKC="+firstSKC.skcId+" firstPrice="+firstPrice+" lastSKC="+lastSKC.skcId+" lastPrice="+lastPrice +" currentAdjustQty="+currentAdjustQty); | |
var targetQty = lastSKC.initQty-rate+currentAdjustQty; | |
printLog("\t计算"+i+"次 firstSKC.initQty="+firstSKC.initQty+" lastSKC.initQty="+lastSKC.initQty+" lastSKC.minQty="+lastSKC.minQty+" lastSKC不够扣减,直接锁定"); | |
if(lastSKC.minQty>targetQty){ | |
lastSKC.fixQty = true; | |
fixQtyList.push(lastSKC.skcId); | |
printLog("\t\t计算"+i+"次 lastSKC.minQty="+lastSKC.minQty+"targetQty="+targetQty+" lastSKC不够扣减,直接锁定"); | |
}else{ | |
firstSKC.initQty = firstSKC.initQty+1;//高的加一个 | |
lastSKC.initQty = targetQty;//低的减rate个 | |
printLog("\t\t计算"+i+"次:"+ +" 扣减完成"); | |
} | |
printLog("\t计算"+i+"次 firstSKC.initQty="+firstSKC.initQty+" lastSKC.initQty="+lastSKC.initQty+" lastSKC.minQty="+lastSKC.minQty+"==计算完成后"); | |
//获取汇总后的平均价 | |
var sumAmountObj = sumSKCAmount(sortSkcsPriceList,skcsData); | |
currentSumAmount = sumAmountObj.totalSumAmount; | |
currentAvgPrice = sumAmountObj.avgPrice; | |
printLog("\t计算"+i+"次:"+" avgPrice="+currentAvgPrice+" target="+avgPriceDown+" sumAmount="+currentSumAmount+" minAmount="+minAmount+" maxAmount="+maxAmount); | |
if(currentSumAmount>=minAmount && currentSumAmount<=maxAmount){ | |
if(currentAvgPrice>=avgPriceDown){ | |
isOK = true; | |
break; | |
} | |
}else{ | |
//扣减后,总金额少于最低或高于最高,则退回 | |
firstSKC.initQty = firstSKC.initQty-1;//高的减一个 | |
lastSKC.initQty = lastSKC.initQty+rate-currentAdjustQty;//低的加rate个 | |
if(currentSumAmount<minAmount){ | |
currentAdjustQty = 1;//当汇总金额小于最低时,adjustQty设置为1,每次减少低价格SKC时,少扣减一个,使得金额总体上升 | |
}else if(currentSumAmount>maxAmount){ | |
currentAdjustQty = -1;//当汇总金额大于最高时,adjustQty设置为-1,每次减少低价格SKC时,多扣减一个,使得金额总体下降 | |
} | |
sumAmountObj = sumSKCAmount(sortSkcsPriceList,skcsData);//退回后,重新计算 | |
currentSumAmount = sumAmountObj.totalSumAmount; | |
currentAvgPrice = sumAmountObj.avgPrice; | |
printLog("\t计算"+i+"次:"+" rate="+rate+" firstSKC="+firstSKC.skcId+" firstPrice="+firstPrice+" lastSKC="+lastSKC.skcId+" lastPrice="+lastPrice+" 扣减完成后金额超出,回滚"); | |
} | |
} | |
if(isOK){ | |
printLog("\t提高平均价计算完成并找到合适平均价,avgPrice="+currentAvgPrice+" target="+avgPriceDown+" sumAmount="+currentSumAmount+" minAmount="+minAmount+" maxAmount="+maxAmount); | |
}else{ | |
printLog("\t计提供平均价算完成并没有找到合适平均价,继续计算"); | |
for(var i=0; i<fixQtyList.length;i++){ | |
calSkcList.dele(fixQtyList[i]); | |
} | |
//继续执行下一次 | |
currentRunTime++; | |
scaleUpAvgPrice(sortSkcsPriceList,calSkcList,skcsData,currentAvgPrice,avgPriceDown,currentSumAmount,minAmount,maxAmount,currentRunTime,currentAdjustQty); | |
} | |
} | |
//减低平均价到目标平均价 | |
////平均价比较高,所以需要减少大于平均价的的skc的深度,同时增加低于平均价的skc的深度,此时总金额可能呈现下降趋势 | |
function scaleDownAvgPrice(sortSkcsPriceList,calList,skcsData,avgPrice,avgPriceUp,sumAmount,minAmount,maxAmount,currentRunTime,adjustQty){ | |
if(currentRunTime>500){ | |
return avgPrice; | |
} | |
printLog("降低平均价计算:currentRunTime="+currentRunTime+" currentAvgPrice="+avgPrice+" target="+avgPriceUp+" sumAmount="+sumAmount+" minAmount="+minAmount+" maxAmount="+maxAmount +" currentAdjustQty="+adjustQty); | |
var size = calList.length; | |
var avgPriceIndex = getAvgPriceIndex(calList,avgPriceUp,skcsData);//获取平均价对应的数组索引号,用于判断成对的用于扣减和增加深度的组合数 | |
printLog("计算的平均价索引位置avgPriceIndex="+avgPriceIndex); | |
var isOK = false; | |
var fixQtyList = []; | |
var currentAvgPrice = avgPrice; | |
var currentSumAmount = sumAmount; | |
var currentAdjustQty = adjustQty;//当汇总金额小于最低时,adjustQty设置为1,每次增加低价格SKC时,多加一个,使得金额总体上升 | |
for(var i=0;i<avgPriceIndex;i++){ | |
var firstSKC = skcsData.list[calList[i]]; | |
var lastSKC = skcsData.list[calList[size-i-1]]; | |
var firstPrice = firstSKC.price; | |
var lastPrice = lastSKC.price; | |
var rate = 0;//计算扣减比率 | |
if(lastPrice!=0) | |
rate = parseInt(firstPrice/lastPrice); | |
//如果数量不够扣减,则不扣减,直接锁定skc | |
printLog("\t计算"+i+"次:"+" rate="+rate+" firstSKC="+firstSKC.skcId+" lastSKC="+lastSKC.skcId +" currentAdjustQty="+currentAdjustQty); | |
if(firstSKC.minQty>firstSKC.initQty-1){ | |
firstSKC.fixQty = true; | |
fixQtyList.push(firstSKC.skcId); | |
printLog("\t计算"+i+"次:"+" rate="+rate+" firstSKC="+firstSKC.skcId+" lastSKC="+lastSKC.skcId +" currentAdjustQty="+currentAdjustQty+" firstSKC不够扣减,直接锁定"); | |
}else{ | |
firstSKC.initQty = firstSKC.initQty-1;//高的减一个 | |
lastSKC.initQty = lastSKC.initQty+rate+currentAdjustQty;//低的加rate个 | |
printLog("\t计算"+i+"次:"+" rate="+rate+" firstSKC="+firstSKC.skcId+" lastSKC="+lastSKC.skcId +" currentAdjustQty="+currentAdjustQty+" 扣减完成"); | |
} | |
//获取汇总后的平均价 | |
var sumAmountObj = sumSKCAmount(sortSkcsPriceList,skcsData); | |
currentSumAmount = sumAmountObj.totalSumAmount; | |
currentAvgPrice = sumAmountObj.avgPrice; | |
if(currentSumAmount>=minAmount && currentSumAmount<=maxAmount){ | |
if(currentAvgPrice<=avgPriceUp){ | |
isOK = true; | |
break; | |
} | |
}else{ | |
//扣减后,总金额少于最低或高于最高,则退回 | |
firstSKC.initQty = firstSKC.initQty+1;//高的加一个 | |
lastSKC.initQty = lastSKC.initQty-rate-currentAdjustQty;//低的减rate个 | |
if(currentSumAmount<minAmount){ | |
currentAdjustQty = 1;//当汇总金额小于最低时,adjustQty设置为1,每次增加低价格SKC时,多加一个,使得金额总体上升 | |
}else if(currentSumAmount>maxAmount){ | |
currentAdjustQty = -1;//当汇总金额小于最低时,adjustQty设置为-1,每次增加低价格SKC时,少加一个,使得金额总体下降 | |
} | |
sumAmountObj = sumSKCAmount(sortSkcsPriceList,skcsData);//退回后,重新计算 | |
currentSumAmount = sumAmountObj.totalSumAmount; | |
currentAvgPrice = sumAmountObj.avgPrice; | |
} | |
printLog("\t计算"+i+"次:"+" avgPrice="+currentAvgPrice+" target="+avgPriceUp+" sumAmount="+currentSumAmount+" minAmount="+minAmount+" maxAmount="+maxAmount +" currentAdjustQty="+currentAdjustQty); | |
} | |
if(isOK){ | |
printLog("\t降低平均价计算完成并找到合适平均价,avgPrice="+currentAvgPrice+" target="+avgPriceUp+" sumAmount="+currentSumAmount+" minAmount="+minAmount+" maxAmount="+maxAmount +" currentAdjustQty="+currentAdjustQty); | |
}else{ | |
printLog("\t降低平均价计算完成并没有找到合适平均价,继续计算"); | |
//将无法扣减的skc从计算队列中清除! | |
for(var i=0; i<fixQtyList.length;i++){ | |
calList.dele(fixQtyList[i]); | |
} | |
//继续执行下一次 | |
currentRunTime++; | |
scaleDownAvgPrice(sortSkcsPriceList,calList,skcsData,currentAvgPrice,avgPriceUp,currentSumAmount,minAmount,maxAmount,currentRunTime,currentAdjustQty); | |
} | |
} | |
//获取平均价格索引号,也就是skc单价高于平均价的最后一个skc的索引号 | |
function getAvgPriceIndex(sortSkcsPriceList,avgPrice,skcsData){ | |
var index1 = 0; | |
//高于平均价的索引位置 | |
for(var i=0; i<sortSkcsPriceList.length;i++){ | |
var skcNode = skcsData.list[sortSkcsPriceList[i]]; | |
var price = skcNode.price; | |
if(price<=avgPrice){ | |
index1 = i; | |
break; | |
} | |
} | |
//对于平均价的索引位置 | |
var index2 = 0; | |
for(var i=sortSkcsPriceList.length-1; i>=0;i--){ | |
var skcNode = skcsData.list[sortSkcsPriceList[i]]; | |
var price = skcNode.price; | |
if(price>=avgPrice){ | |
break; | |
}else{ | |
index2++; | |
} | |
} | |
//取最小的返回,作为扣减的组数 | |
return index1>index2?index2:index1; | |
} | |
//校验组货SKC数量规则,校验价格带是否符合目标 | |
function checkSKCCountAndPriceList(errMsg,checkTypes,skcsData,ruleTableNode,weekNode,monthNode){ | |
checkTypes.forEach(function(checkType){ | |
//表1#=SKC标准及LOOK套数的标准值 | |
var tableRuleT1 = filterRuleTable(ruleTableNode,"1",true,{UR_SDS_CommodityType:"UR_enum_CommodityType:"+checkType}); | |
var skcRule = tableRuleT1.UR_SDS_Rule; | |
var skcRuleName = locale.getEnumName(skcRule); | |
var skcCountRule = getEnumValue(skcRule); | |
var skcCountValue = tableRuleT1.UR_SDS_SKCQuantity; | |
if(tableRuleT1){ | |
Object.keys(skcsData[checkType].styles.skcCount).forEach(function(styleId){ | |
var styleSkcCount = skcsData[checkType].styles.skcCount[styleId]; | |
var isSKCCountOk = checkModSKCCount(styleSkcCount,skcCountRule,skcCountValue); | |
if(!isSKCCountOk){ | |
errMsg.push("设计号【"+styleId+"】的skc个数【"+styleSkcCount+"】,不符合同款内SKC【"+skcRuleName+"】【"+skcCountValue+"】个数要求"); | |
} | |
}); | |
} | |
//处理每个skc按照品类+中品类的组货单价-价格带范围 | |
skcsData[checkType].categoryKey.forEach(function(key){ | |
var skcsList = skcsData.skcs[key]; | |
if(skcsList.length>0){ | |
var skcNode = skcsData.list[skcsList[0]]; | |
var commodityType = skcNode.commodityType; | |
var catId = skcNode.catId; | |
var midCatId = skcNode.midCatId; | |
var keyName = skcNode.categoryKeyName; | |
//返回多个价格带 | |
var tableRuleT9 = filterRuleTable(ruleTableNode,"9",false,{UR_SDS_CommodityType:"UR_enum_CommodityType:"+checkType,UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_ProductLargeType:catId,UR_SDS_MiddleCategoryType:midCatId}); | |
if(tableRuleT9 && tableRuleT9.length>0){ | |
var priceRange = getPriceRange(tableRuleT9); | |
skcsList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
var price = skcNode.price; | |
if(price < priceRange.get("low") || price > priceRange.get("high")){ | |
errMsg.push(keyName+" SKC=【"+skcId+"】的价格为【"+price+"】,不在规则表配置的价格带范围内【"+priceRange.get("low") + " - " + priceRange.get("high") + "】"); | |
} | |
}); | |
} | |
} | |
}); | |
}); | |
} | |
//校验主题款SKC的LOOK数量 | |
//checkOnly=true,不进行最低深度计算,适用于组货确认时的检核,如果是组货计算,传递false | |
function checkSKCLookCount(errMsg,checkOnly,modList,modsObj,skcsData,ruleTableNode,weekNode,monthNode){ | |
printLog("==========按规则表检查Look数量【开始】checkOnly="+checkOnly+"=============="); | |
var isSpecialWeek = false; | |
var isLastWeek = weekNode.UR_ML_IsLastOrder; | |
var specialWeekOverSKCCount = 0; //规则表中对应的skc数 | |
var specialWeekOverSKCModNum = 0;//规则表中定义的允许几个模块超出skc数 | |
var specialWeekSKCCountRule = ""; | |
var specialWeekSKCCountRuleName = ""; | |
//表2#=特殊款最低深度设置表 | |
var tableRule2 = filterRuleTable(ruleTableNode,"2",true,{UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_BillNo:weekNode.C8_ML_Week}); | |
if(tableRule2 && tableRule2.$URL && tableRule2.$URL!=""){ | |
specialWeekOverSKCCount = tableRule2.UR_SDS_SKCQuantity; | |
specialWeekOverSKCModNum = tableRule2.UR_SDS_ModuleQuantity;//规则表中定义的允许几个模块超出skc数 | |
specialWeekSKCCountRule = getEnumValue(tableRule2.UR_SDS_Rule); | |
specialWeekSKCCountRuleName = locale.getEnumName(tableRule2.UR_SDS_Rule); | |
isSpecialWeek = true; | |
}else{ | |
printLog("warning:没有找到表2#特殊款最低深度设置表"); | |
} | |
printLog("isSpecialWeek:"+isSpecialWeek); | |
var tableRuleS1 = filterRuleTable(ruleTableNode,"1",true,{UR_SDS_CommodityType:"UR_enum_CommodityType:S"}); | |
var overSKCCountModNumber = 0;//超出skc数量的模块数量 | |
var overSKCCountModErrMsg = ""; | |
if(tableRuleS1 && tableRuleS1.$URL && tableRuleS1.$URL!=""){ | |
//获取1#表的规则信息 | |
var skcRule = tableRuleS1.UR_SDS_Rule; | |
var skcRuleName = locale.getEnumName(skcRule); | |
var skcCountRule = getEnumValue(skcRule); | |
var skcCountValue = tableRuleS1.UR_SDS_SKCQuantity; | |
var lookCountUpper = tableRuleS1.UR_SDS_LOOKUpper; | |
var lookCountLower = tableRuleS1.UR_SDS_LOOKLower; | |
//look最低深度与全国月最低深度校验 | |
//获取表4中按照月+风格的单月全国最低覆盖 | |
var countryMinQty = 0; | |
//表J#=月度&风格金额/全国覆盖最低深度 | |
var tableRuleS4 = filterRuleTable(ruleTableNode,"J",true,{UR_SDS_ProductStyle:monthNode.C8_MC_Style,UR_SDS_Month:monthNode.C8_MC_Month}); | |
if(tableRuleS4 && tableRuleS4.$URL && tableRuleS4.$URL!=""){ | |
countryMinQty = tableRuleS4.UR_SDS_MonthDepth; | |
printLog("单月全国最低覆盖:"+countryMinQty); | |
} | |
modList.forEach(function(modNum,index){ | |
var oneModObj = modsObj[modNum]; | |
var lookCount = oneModObj.lookCount; | |
var lookSKCCount = oneModObj.skcCount; | |
if(lookCount<lookCountLower || lookCount>lookCountUpper){ | |
errMsg.push("模块号【"+modNum+"】的look套数为【"+lookCount+"】,不符合【"+lookCountLower+"-"+lookCountUpper+"】套数区间要求"); | |
} | |
var isSKCCountOk = checkModSKCCount(lookSKCCount,skcCountRule,skcCountValue); | |
if(!isSKCCountOk){ | |
if(!isSpecialWeek){ | |
errMsg.push("模块号【"+modNum+"】的skc个数【"+lookSKCCount+"】,不符合同模块号内SKC【"+skcRuleName+"】【"+skcCountValue+"】个数要求"); | |
}else{ | |
isSKCCountOk = checkModSKCCount(lookSKCCount,specialWeekSKCCountRule,specialWeekOverSKCCount); | |
if(isSKCCountOk){ | |
overSKCCountModNumber++;//记录有多少个超出了模块数量 | |
overSKCCountModErrMsg += "模块号【"+modNum+"】的skc个数【"+lookSKCCount+"】,不符合同模块号内SKC【"+skcRuleName+"】【"+skcCountValue+"】个数要求</BR>"; | |
}else{ | |
if(isLastWeek){ | |
isSKCCountOk = checkModSKCCount(lookSKCCount,"range","8,9,10,11,12,13"); | |
if(!isSKCCountOk){ | |
errMsg.push("模块号【"+modNum+"】的skc个数【"+lookSKCCount+"】,【最后一单】的SKC数不在范围【8,9,10,11,12,13】个数要求"); | |
} | |
}else{ | |
errMsg.push("模块号【"+modNum+"】的skc个数【"+lookSKCCount+"】,不符合同模块号内SKC【"+skcRuleName+"】【"+skcCountValue+"】个数要求"); | |
errMsg.push("模块号【"+modNum+"】的skc个数【"+lookSKCCount+"】,也不符合规则表设定的【"+specialWeekSKCCountRule+"】【"+specialWeekOverSKCCount+"】个数要求"); | |
} | |
} | |
} | |
} | |
//汇总look所有最低深度,与全国月最低覆盖对比 | |
var lookTotalMinQty = 0; | |
//计算此模块下的look量 | |
var lookList = oneModObj.looks.list; | |
var minQtySKCs = []; | |
printLog("计算模块:"+modNum+"下look的最低深度值"); | |
lookList.forEach(function(look){ | |
var lookSKCs = oneModObj.looks[look]; | |
//取skc最低值 | |
var currentMinQty = 999999999; | |
var minQtySKCId = ""; | |
var minQtySKCName = ""; | |
lookSKCs.forEach(function(skcurl){ | |
var skcNode = skcsData.list[skcurl]; | |
var initQty = skcNode.lookCalQty; | |
printLog("\tlook="+look+" skc="+skcNode.skcName+" 最低值="+initQty); | |
if(initQty<currentMinQty && initQty > 0){ | |
currentMinQty = initQty; | |
minQtySKCId = skcurl; | |
minQtySKCName = skcNode.skcName; | |
} | |
}); | |
printLog("\tlook="+look+" 最低值="+currentMinQty); | |
//如果一个look下的所有skc剩余深度都是0,则计算有问题 | |
if(currentMinQty == 999999999){ | |
errMsg.push("模块号【"+modNum+"】的所有skc在【" + look + "】下的组货深度都是0,计算出现问题,请调整初始组货深度!"); | |
currentMinQty = 0; | |
} | |
//汇总最低值 | |
lookTotalMinQty += currentMinQty; | |
/* | |
//如果一个skc在多个look都是最低值,那么在第一个最低值的look扣减后,可用组货深度为0,所以计算有问题 | |
if(minQtySKCs.includes(minQtySKCId)){ | |
errMsg.push("模块号【"+modNum+"】的skc【"+minQtySKCName+"】,在多个look下的组货深度都是最低值,计算出现问题,请调整初始组货深度!"); | |
}else{ | |
minQtySKCs.push(minQtySKCId); | |
} | |
*/ | |
//扣减 | |
lookSKCs.forEach(function(skcurl){ | |
skcsData.list[skcurl].lookCalQty=skcsData.list[skcurl].lookCalQty-currentMinQty; | |
}); | |
}); | |
printLog("计算模块:"+modNum+"下look的最低深度值完成 最低深度="+lookTotalMinQty); | |
/*改为look最低深度大于0且不是检核时就计算深度 | |
if(lookTotalMinQty<countryMinQty){ | |
errMsg.push("模块号【"+modNum+"】的所有look最低深度汇总值【"+lookTotalMinQty+"】【小于】单月全国覆盖最低深度【"+countryMinQty+"】!"); | |
}else */ | |
if(lookTotalMinQty>0 && !checkOnly){ | |
printLog("计算模块:"+modNum+"下look的最低深度值完成 最低深度="+lookTotalMinQty+" 满足全国最低深度要求,计算SKC的最低深度值"); | |
var scalePct = countryMinQty/lookTotalMinQty; | |
printLog("\t满足全国最低深度要求,计算SKC的最低深度值, 按照初始深度缩放【"+scalePct+"】后作为skc最小值"); | |
//look款skc深度满足全国最低深度时, | |
lookList.forEach(function(look){ | |
var lookSKCs = oneModObj.looks[look]; | |
//将每个skc的初始深度乘以scalePct后作为最低深度 | |
lookSKCs.forEach(function(skcurl){ | |
var skcNode = skcsData.list[skcurl]; | |
var lookCalQty = skcNode.lookCalQty; | |
var initQty = skcNode.initQty; | |
if(lookCalQty>0) | |
initQty = initQty - lookCalQty;//减掉扣减剩余部分,才是改skc在look下的最低深度,同时也是多个look下最低深度汇总之和 | |
var minQty = skcNode.minQty; | |
var scaleQty = parseInt(initQty*scalePct)+1;//加1,表示要比最小值要高一些 | |
printLog("\tlook="+look+" skc="+skcNode.skcName+"look款最低深度计算前 minQty="+minQty+" initQty="+initQty+" scaleQty="+scaleQty); | |
if(minQty<scaleQty){ | |
minQty = scaleQty; | |
skcNode.minQty = scaleQty; | |
//初始深度小于单skc最低深度,则取单skc最低深度为初始深度 | |
if(initQty < scaleQty){ | |
skcNode.initQty = scaleQty; | |
} | |
} | |
printLog("\tlook="+look+" skc="+skcNode.skcName+"look款最低深度计算后 minQty="+minQty); | |
}); | |
}); | |
} | |
}); | |
//如果模块skc数校验失败 | |
if(overSKCCountModErrMsg !="" && overSKCCountModNumber>specialWeekOverSKCModNum && specialWeekOverSKCModNum>0){ | |
errMsg.push(overSKCCountModErrMsg); | |
} | |
}else{ | |
printLog("warning:没有找到表1#SKC标准及LOOK套数的标准值&组货系数"); | |
} | |
printLog("==========按规则表检查Look数量 ErrMsg="+errMsg.join("\n")+"=============="); | |
printLog("==========按规则表检查Look数量【结束】checkOnly="+checkOnly+"=============="); | |
} | |
//获取两个时间的时间差 | |
function timeDiff(date1,date2){ | |
var retStr = ""; | |
var diff = date2.getTime()-date1.getTime(); | |
if(diff<1000){ | |
retStr = diff+"毫秒"; | |
}else{ | |
var secondValue = diff/1000;//转换为秒数 | |
if(secondValue>60){ | |
//转换为分钟 | |
var minValue = parseInt(secondValue/60); | |
var secValue = parseInt(secondValue%60); | |
retStr = minValue+"分钟"+secValue+"秒"; | |
}else{ | |
retStr = secondValue.toFixed(2)+"秒"; | |
} | |
} | |
return retStr; | |
} | |
//复制款式 Jarvis 20231127 | |
function copyStyleFormOldStyle(ac,node){ | |
var newurl = comm.createUrl("Style"); | |
var dataMap = new Map(); | |
dataMap["ProductSalesRegions"] = false; | |
dataMap["Shape"] = false; | |
dataMap["RealizedProducts"] = false; | |
dataMap["Wbs"] = false; | |
dataMap["Suppliers"] = false; | |
dataMap["Crew"] = false; | |
dataMap["Images"] = true; | |
dataMap["Comments"] = false; | |
dataMap["Documents"] = false; | |
dataMap["Theme"] = false; | |
dataMap["CompetitiveStyles"] = false; | |
dataMap["ProductColors"] = true; | |
var sheetMap = new Map(); | |
sheetMap["ApparelBOM"] = false; | |
var stateMap = new Map(); | |
stateMap["APPROVED"] = true; | |
stateMap["CLOSED"] = true; | |
stateMap["DRAFT"] = true; | |
stateMap["PENDING"] = true; | |
stateMap["ABANDONED"] = true; | |
var sampleMap = new Map(); | |
ac.m_writer.callMethod("Apparel", "CollectionCopyStyle") | |
.addParameter("VOPT.Shape", "ref", "centric:") | |
.addParameter("VOPT.Theme", "ref", "centric:") | |
//.addParameter("VOPT.Node Name", "string", node.$Name) 名称不复制 | |
.addParameter("CVOPT.RevisionBehavior", "enum", "RevisionCopyOptions:CopyAllRevisions") | |
.addParameter("VOPT.PreventDuplicateCarryover", "boolean", "false") | |
.addParameter("OPT.GeneralData", "booleanmap", dataMap) | |
.addParameter("OPT.DataSheets", "booleanmap", sheetMap) | |
.addParameter("OPT.CopiedStyleQuoteStates", "booleanmap", stateMap) | |
.addParameter("OPT.CopiedStyleSampleTypes", "booleanmap", sampleMap) | |
.addParameter("URL", "ref", newurl) | |
.addParameter("ParentURL", "ref", node.__Parent__) | |
.addParameter("VOPT.SelectedURLs", "reflist", node.ProductColors) | |
.addParameter("FromURL", "ref", node.$URL); | |
ac.m_writer.execute({sync: true}); | |
ac.m_writer.callMethod("SiteAdmin", "ValidateAndDeleteIfFailed") | |
.addParameter("URL", "ref", newurl); | |
ac.m_writer.execute({sync: true}); | |
return newurl; | |
} | |
//打印日志,后续可以控制关闭 | |
function printLog(msg){ | |
if(currentUserMidName && currentUserMidName==="log"){ | |
console.log(new Date()+"\t"+msg); | |
} | |
} | |
//获取cookie | |
function getCookie() { | |
getCookie = (name) => document.cookie.match(`[;\s+]?${name}=([^;]*)`)?.pop(); | |
let c8_cookie = "SecurityTokenURL=" + getCookie("SecurityTokenURL") + ";"; | |
c8_cookie = c8_cookie + "CSRFToken=" + getCookie("CSRFToken"); | |
return c8_cookie; | |
} | |
//以当前用户身份调用系统内部后台接口统一方法(同步) | |
function invokeJavaActionCurrentUser(loadingMessage, method, jsonData) { | |
if (loadingMessage == null || loadingMessage == "") | |
loadingMessage = "系统处理中,请稍等....."; | |
var loading = jp.loading(loadingMessage); | |
$.ajax({ | |
type: 'post', | |
url: pluginsURL + method, | |
beforeSend: function(request) { | |
request.setRequestHeader("C8_Cookie",getCookie()); | |
}, | |
data: JSON.stringify(jsonData), | |
async: false, | |
contentType: 'application/json;charset=utf-8', | |
dataType: 'json', | |
error: function (data) { | |
jp.close(loading); | |
jp.alert("调用系统后台失败,请联系管理员!"); | |
}, | |
success: function (data) { | |
var dataObj = eval(data); | |
jp.close(loading); | |
if (dataObj.code == 0) { | |
result = 'success'; | |
jp.success("处理完成:" + dataObj.msg ); | |
} else { | |
result = dataObj.msg; | |
jp.alert("处理完成:" + dataObj.data); | |
} | |
} | |
}); | |
} | |
//隐藏动作按钮Action | |
api.hideAction("SpecificationDataSheet","","PurgeRevisions"); | |
api.hideAction("SpecificationDataSheet","","PurgeResetRevisions"); | |
api.hideAction("SpecificationDataSheet","","Abandon"); | |
api.hideAction("SpecificationDataSheet","", "ReviseAndAbandon"); | |
//设置单号上可编辑门店数据 | |
api.setRelationshipAccess("MarketingLook", "LookProducts", true); | |
//设置组货界面可以编辑款式和SKC上数据 | |
api.setRelationshipAccess("MCProduct", "C8_MCP_SKC", true); | |
api.setRelationshipAccess("MCProduct", "ProductStyle", true) | |
api.setRelationshipAccess("Colorway", "Style", true); | |
api.setRelationshipAccess("Style", "Attributes", true); | |
api.excludeActionFromEllipses("C8_CopyStyle"); | |
api.excludeActionFromEllipses("C8_ZhuanBan"); | |
api.defineModule("Site/StoreMap",[ | |
"dojo/_base/declare", | |
"csi/_base/underscore", | |
"csi/store/Nodes", | |
"csi/table/matrix/ColumnMap", | |
"csi/xml/Query" | |
], function(declare,_,Nodes,ColumnMap,Query) { | |
return declare(ColumnMap, { | |
/** @property {Nodes} _CustomerStore - Data store of the site-level Holiday nodes */ | |
_CustomerStore: null, | |
/** | |
* Query for all customers | |
*/ | |
addDeferred: function(ctx, h, dfds) { | |
this._CustomerStore = new Nodes({ | |
cachingStore: ctx.cache, | |
sortQuery: new Query().SortByAttr("SortOrder"), | |
typeNode: "Customer" | |
}); | |
dfds.push(this._CustomerStore.query()); | |
}, | |
/** | |
* If only one Heading in matrix, then do not render sub-header | |
*/ | |
shouldRenderLoneSubheader: function(subSpec) { | |
return false; | |
}, | |
/** | |
* If view has active customers, then only return subset of all customers | |
*/ | |
_getColumnNodes: function(ctx, h) { | |
var customers = this._CustomerStore.query(); | |
return customers; | |
} | |
}); | |
}); | |
api.defineModule("Site/StoreMapAll",[ | |
"dojo/_base/declare", | |
"csi/_base/underscore", | |
"csi/store/Nodes", | |
"csi/table/matrix/ColumnMap", | |
"csi/xml/Query" | |
], function(declare,_,Nodes,ColumnMap,Query) { | |
return declare(ColumnMap, { | |
/** @property {Nodes} _CustomerStore - Data store of the site-level Holiday nodes */ | |
_CustomerStore: null, | |
mapKeyColumnId: "$URL", | |
/** | |
* Query for all languages | |
*/ | |
addDeferred: function(ctx, h, dfds) { | |
this._CustomerStore = new Nodes({ | |
cachingStore: ctx.cache, | |
sortQuery: new Query().SortByAttr("SortOrder"), | |
typeNode: "Customer" | |
}); | |
dfds.push(this._CustomerStore.query()); | |
}, | |
/** | |
* If only one Heading in matrix, then do not render sub-header | |
*/ | |
shouldRenderLoneSubheader: function(subSpec) { | |
return true; | |
}, | |
/** | |
* If view has active customer, then only return subset of all customer | |
*/ | |
_getColumnNodes: function(ctx, h) { | |
var customers = this._CustomerStore.query(); | |
return customers; | |
} | |
}); | |
}); | |
api.defineModule("Site/MonthWeekMap",[ | |
"dojo/_base/declare", | |
"csi/_base/underscore", | |
"csi/store/Nodes", | |
"csi/table/matrix/ColumnMap", | |
"csi/xml/Query" | |
], function(declare,_,Nodes,ColumnMap,Query) { | |
return declare(ColumnMap, { | |
/** @property {Nodes} _WeekStore - Data store of the site-level Holiday nodes */ | |
_WeekStore: null, | |
mapKeyColumnId: "$URL", | |
/** | |
* Query for all languages | |
*/ | |
addDeferred: function(ctx, h, dfds) { | |
this._WeekStore = new Nodes({ | |
cachingStore: ctx.cache, | |
sortQuery: new Query().RefAttr("__Parent__", xml.OP_EQUALS, routerStore.locationNode.$URL).SortByAttr("C8_ML_Week"), | |
typeNode: "MarketingLook" | |
}); | |
dfds.push(this._WeekStore.query()); | |
}, | |
/** | |
* If only one Heading in matrix, then do not render sub-header | |
*/ | |
shouldRenderLoneSubheader: function(subSpec) { | |
return true; | |
}, | |
/** | |
* If view has active customer, then only return subset of all customer | |
*/ | |
_getColumnNodes: function(ctx, h) { | |
var customers = this._WeekStore.query(); | |
return customers; | |
} | |
}); | |
}); | |
api.defineModule("Site/StoreMapAllByRows",[ | |
"dojo/_base/declare", | |
"csi/_base/underscore", | |
"csi/store/Nodes", | |
"csi/table/matrix/RowRootMap", | |
"csi/xml/Query" | |
], function(declare,_,Nodes,RowRootMap,Query) { | |
return declare(RowRootMap, { | |
/** @property {Nodes} _HolidayStore - Data store of the site-level Holiday nodes */ | |
mapKeyRowId: "$URL", | |
}); | |
}); | |
//在Crumb Search最后侧增加状态显示 | |
//系统标准cssName: csi-state-draft csi-state-pending csi-state-approved | |
//系统标准cssName: commentColorBlue commentColorGreen commentColorViolet commentColorPlum commentColorYellow | |
//系统标准cssName: stateWrapper csi-state-other (此为一组css) | |
//系统标准cssName: stateWrapper csi-state-draft | |
function displayCrumbSearchStatus(divId,displayValue,cssName){ | |
if(!cssName){ | |
cssName = "csi-state-draft"; | |
} | |
if($("#"+divId) && $("#"+divId).length==1){ | |
$("#"+divId).text(displayValue); | |
}else{ | |
var domNode = $("div[class*='crumb crumbSearch']").last(); | |
if(domNode){ | |
domNode.append('<div id="'+divId+'" class="csi-name-value-pair csi-state '+cssName+'">'+displayValue+'</div>'); | |
} | |
} | |
} | |
topic.subscribe("/csi/view/start", function(view) { | |
var key = view.defView.getKey(); | |
var m_id = view.defView.m_id; | |
var m_idType = view.defView.m_idType; | |
var m_typeView = view.defView.m_typeView; | |
var ViewNode = view.getViewNode(); | |
var currentNode = routerStore.locationNode; | |
//Agnes 20240321 统一移除表单上的保存&继续和保存&新建按钮 | |
if(view.defView.m_defActions ){ | |
if(view.defView.m_defActions.getAction("Save_Go")){ | |
view.defView.m_defActions.removeAction("Save_Go"); | |
} | |
if(view.defView.m_defActions.getAction("Save_New")){ | |
view.defView.m_defActions.removeAction("Save_New"); | |
} | |
if(view.defView.m_defActions.getAction("Save_Copy")){ | |
view.defView.m_defActions.removeAction("Save_Copy"); | |
} | |
} | |
try { | |
if (key == "__HeaderToolbar__|User") { | |
rules = getLocalStorage(); | |
proto = Object.create(view.defView.m_defs[0].m_rules[0].__proto__); | |
} else { | |
checkFieldRight(view); | |
} | |
} catch (err) { | |
console.error("字段权限控制异常:", err); | |
} | |
//设置水印 | |
if (currentUserNode) { | |
var currentTime = new Date(); | |
var year = currentTime.getFullYear(); | |
var month = currentTime.getMonth() + 1; // 月份从0开始,所以要加1 | |
var day = currentTime.getDate(); | |
var dateStr = year + "-" + month + "-" + day ; | |
watermark.load({ watermark_txt:currentUserNode.$Name + "\n( "+currentUserNode.UserID + " )\n" + dateStr }) | |
} | |
//进入到单号下,显示对应的状态信息 | |
if(key=="C8_DSZuHuo|MarketingLook" || key=="C8_HWZuHuo|MarketingLook" || key=="C8_GNZuHuo|MarketingLook" || key=="C8_HWZuHuoOM|MarketingLook"){ | |
var pairValueSpan = null; | |
var pairNameValueDiv = null; | |
var mlStatus = currentNode.C8_ML_Status; | |
var monthNode = view.cacheView.getNode(currentNode.PrimaryCollection) | |
var orderType = locale.getEnumName(monthNode.C8_MC_MonthOrderAattribute); | |
var displayValue = locale.getEnumName(mlStatus); | |
var mlStatusKey = getEnumValue(mlStatus); | |
var divId = "C8StatusDiv"; | |
var cssName = "csi-state-draft"; | |
if(mlStatusKey=='Complete'){ | |
cssName = "csi-state-approved"; | |
} | |
displayCrumbSearchStatus("C8OrderType",orderType,cssName); | |
displayCrumbSearchStatus(divId,displayValue,cssName); | |
} | |
//如果组货页面的 | |
var zhPages = ["MCProducts|MarketingLook","C8_MCProductsDS|MarketingLook","C8_GroupGoodsGallery|MarketingLook","C8_GroupGoodsGalleryOM|MarketingLook"]; | |
if(zhPages.includes(key)){ | |
if(ViewNode.$Type=="MarketingLook"){ | |
var weekStatus = ViewNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
var statusDisplay = locale.getEnumName(weekStatus); | |
var cssName = "csi-state-draft"; | |
if(weekStatusValue=='Complete'){ | |
cssName = "csi-state-approved"; | |
} | |
$(view.domNode.parentElement.firstChild).text(ViewNode.$Name); | |
$(view.domNode.parentElement.firstChild).append('<span> </span><span class="csi-name-value-pair csi-state '+cssName+'" style="font-size:14px;">'+statusDisplay+'</span>'); | |
var editableAttributes = ["C8_MCP_SuggestedLevel","C8_MCP_AdjustingDepth","C8_MCP_SKCLock"]; | |
if(weekStatusValue=="Complete"){ | |
view.defView.bReadOnly=true; | |
}else if(weekStatusValue=="Lock"){ | |
view.defView.m_headings.forEach(function(h,i){ | |
if(!editableAttributes.includes(h.m_id)){ | |
h.setRight("View"); | |
} | |
}); | |
} | |
} | |
} | |
switch (key) { | |
case "__Form__|SpecificationDataSheet": { | |
if (view.defView && view.defView.m_formData && view.defView.m_formData.m_source) { | |
var acNode = view.defView.m_formData.m_source.m_action; | |
if (acNode.m_id == "NewSpecificationDataSheetFromTemplate" || acNode.m_id == "Copy") { | |
var node = view.defView.m_formData.m_source.m_aSources[0]; | |
//view.addFixedValue("C8_SD_Channel",node.C8_SD_Channel); | |
//类型为组货管控规则时隐藏年份季节字段 Agnes 20240221 | |
var subtype = view.getField("Subtype"); | |
subtype.m_onChange = onChangeSDSubtype(view); | |
} | |
if(acNode.m_id == "NewDataSheetTemplates" || acNode.m_id == "Copy"){ | |
//类型为组货管控规则时隐藏年份季节字段 Agnes 20240221 | |
var subtype = view.getField("Subtype"); | |
subtype.m_onChange = onChangeSDSubtype(view); | |
} | |
} | |
break; | |
} | |
case "C8_ZhuanBanForm|Style":{ | |
if(ViewNode.$Type == "Style"){ | |
var catNode = resolver.m_cache.getNode(ViewNode.Category1,true); | |
if(catNode.UR_Brand_Brand == "UR_enum_Brand:01" && catNode.UR_Brand_ProductSeriation == "UR_enum_ProductSeriation:I"){ | |
view.addFixedValue("C8_Style_Translation","UR_enum_Translation:02"); | |
}else{ | |
view.addFixedValue("C8_Style_Translation","UR_enum_Translation:01"); | |
} | |
} | |
break; | |
} | |
} | |
}); | |
function onChangeSDSubtype(view){ | |
view.addHideExpression("C8_SD_YearSeaon", "attr(attr('Subtype'),'Node Name')=='组货管控规则' "); | |
} | |
topic.subscribe("/csi/action/start", function (ac) { | |
var actionId = ac.m_action.m_id; | |
var actionName = ac.m_action.m_name; | |
//组货点击后,需要刷新 | |
if(actionId == "C8_StoreGroupGoods" && actionName == "组货"){ | |
ac.widget.refreshData(); | |
} | |
}); | |
topic.subscribe("/csi/action/end", function (ac) { | |
var actionId = ac.m_action.m_id; | |
var actionName = ac.m_action.m_name; | |
//移除组货skc后删除mcproduct并更新colorway上对应渠道组或信息 | |
if(actionId == "Remove" && ac.m_idAttrParent && ac.m_idAttrParent=="LookProducts" ){ | |
var mcp = ac.m_urlNode; | |
var mcpNode = getNode(ac,mcp); | |
var viewId = ac.widget.defView.m_id; | |
var attName = ""; | |
if(viewId=="MCProducts"){ | |
attName = "C8_CW_GNPick"; | |
}else if(viewId=="C8_MCProductsDS"){ | |
attName = "C8_CW_DSPick"; | |
}else if(viewId=="C8_GroupGoodsGallery"){ | |
attName = "C8_CW_HWPick"; | |
} | |
if(attName !="" && mcpNode && mcpNode.C8_MCP_SKC && mcpNode.C8_MCP_SKC!="centric:"){ | |
ac.m_writer.changeNode(mcpNode.C8_MCP_SKC).changeAttribute(attName,"boolean",false); | |
} | |
//20240422 C8_CW_GNDepth、C8_CW_HWDepth、C8_CW_DSDepth均为0时 | |
// 清空 组货单号 UR_CW_GroupBillNo、确认唯一码 UR_Colorway_OKCode 两个字段 | |
var skc = ac.m_cache.addNode(mcpNode.C8_MCP_SKC); | |
if(skc.C8_CW_GNDepth == 0 && skc.C8_CW_HWDepth == 0 && skc.C8_CW_DSDepth == 0){ | |
ac.m_writer.changeNode(mcpNode.C8_MCP_SKC).changeAttribute("UR_CW_GroupBillNo","ref","centric:") | |
.changeAttribute("UR_Colorway_OKCode","string",""); | |
//清空款式属性组货单号:UR_StyleAttributes_GroupBillNo | |
var style = ac.m_cache.addNode(skc.__Parent__); | |
ac.m_writer.changeNode(style.Attributes).changeAttribute("UR_StyleAttributes_GroupBillNo","enum","UR_enum_billno:"); | |
} | |
ac.m_writer.deleteNode(mcp,true); | |
ac.m_writer.execute({sync:true}); | |
} | |
}) | |
//api 调用 | |
api.hideAction("MarketingLook", "MCProducts", "Edit"); | |
//监控colorway上产品等级变更,初始化海外组货时各门店的产品等级 Agnes 20240303 | |
api.watchAttribute("Colorway", "C8_CW_StoreLevel", function (ac, cn, node, id) { | |
var search = new Search(); | |
var map = new Map(); | |
var q = search.getQuery(); | |
//查询Customer 海外店群 | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "Customer"); | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if(results){ | |
results.forEach(function(customer){ | |
var customerUrl = customer.$URL; | |
map[customerUrl]= ac.newValue; | |
}); | |
} | |
//查询组货SKC | |
var search2 = new Search(); | |
var q2 = search2.getQuery(); | |
q2.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCProduct") | |
.RefAttr("C8_MCP_SKC", xml.OP_EQUALS, node.$URL); | |
var orSearch = q2.Or(); | |
orSearch.Attr("C8_MC_Channel", xml.OP_EQUALS, "UR_enum_Channel:OVEC", "Child:__Parent__"); | |
orSearch.Attr("C8_MC_Channel", xml.OP_EQUALS, "UR_enum_Channel:EA", "Child:__Parent__"); | |
res = search2.execute({sync: true}); | |
results = res.getResultNodes(); | |
if(results){ | |
ac.m_writer.changeNode(results[0].$URL).changeAttribute("C8_MCP_StoreLevel","enummap", map); | |
//{"C3208": "UR_ProductLevel:B", "C942329": "UR_ProductLevel:A"}); | |
} | |
return true; | |
}); | |
//wanglong 20240107 款式发送至SCP pluginsURL | |
api.watchAttribute("StyleAttributes", "UR_StyleAttributes_SendToSCP", function (ac, cn, node, id) { | |
debugger | |
if (ac.newValue) { | |
var styleNode = getNode(ac,node.__Parent__); | |
var msg = "请先填写"; | |
var flag = false; | |
//校验设计师跟基本单位必填 | |
if (node.UR_StyleAttributes_BasicUnit == "UR_enum_Unit:") { | |
msg = msg + "基本单位,"; | |
flag = true; | |
} | |
if (node.UR_StyleAttributes_MiddleCategoryType == "UR_enum_ProductMiddleType:") { | |
msg = msg + "中品类,"; | |
flag = true; | |
} | |
//图片必填 | |
if(Object.entries(styleNode.Images).length == 0){ | |
msg = msg + "款式图片,"; | |
flag = true; | |
} | |
if (node.UR_StyleAttributes_Designer == "centric:") { | |
msg = msg + "设计师,"; | |
flag = true; | |
} | |
//20220809 检查“设计助理必填” deliang.wei | |
if (node.UR_StyleAttributes_DesignAssistant == "centric:" || !node.UR_StyleAttributes_DesignAssistant) { | |
msg = msg + "设计助理,"; | |
flag = true; | |
} | |
if(flag){ | |
jp.alert(msg+"以上信息后,在发送!"); | |
cn.changeAttribute("UR_StyleAttributes_SendToSCP", "boolean", false); | |
return true; | |
} | |
var loading = jp.loading("接口请求中"); | |
var data = {"styleUrl":styleNode.$URL,"lookUrl":""}; | |
requestPlM2ServiceApi('/ur/plm2_scp_004', data , false) | |
.then(function(result) { | |
jp.close(loading); | |
if(result){ | |
// result是错误信息,有值则错误 | |
jp.alert(result); | |
cn.changeAttribute("UR_StyleAttributes_SengToSCPMsg", "string", result); | |
cn.changeAttributeExp("UR_StyleAttributes_SendToSCPTime", "nowTime()", true); | |
cn.changeAttribute("UR_StyleAttributes_SendToSCP", "boolean", false); | |
}else{ | |
jp.alert('发送成功!'); | |
cn.changeAttribute("UR_StyleAttributes_SengToSCPMsg", "string", "数据接收成功"); | |
cn.changeAttributeExp("UR_StyleAttributes_SendToSCPTime", "nowTime()", true); | |
} | |
ac.widget.refreshData(); | |
}) | |
.catch(function(error) { | |
jp.alert(error); | |
jp.close(loading); | |
cn.changeAttribute("UR_StyleAttributes_SengToSCPMsg", "string", error); | |
cn.changeAttributeExp("UR_StyleAttributes_SendToSCPTime", "nowTime()", true); | |
ac.widget.refreshData(); | |
}); | |
} | |
return true; | |
}); | |
//选择基础色带出成衣色 Thomas 2017/12/11 | |
api.watchAttribute("Colorway", "UR_Colorway_BaseColor", function (ac, cn, node, id) { | |
if (ac.newValue == "centric:") { | |
cn.changeAttribute("Code", "string", ""); | |
cn.changeAttribute("Node Name", "string", ""); | |
cn.changeAttributeExp("ColorSpecification", "ref(null)", true); | |
cn.changeAttributeExp("Images", "map(ref_type)", true); | |
return; | |
} else { | |
var objColor = ac.m_cache.getNode(ac.newValue, true); | |
var vMiddleType = objColor.UR_ColorSpec_MiddleType; | |
var objStyle = ac.m_cache.getNode(node.__Parent__, true); | |
var vProductColors = ac.m_cache.getNodes(objStyle.ProductColors, true); | |
var codeIndex = vMiddleType.indexOf(":"); | |
var vCode = vMiddleType.substring(codeIndex + 1, vMiddleType.length); | |
if (vProductColors != null) { | |
for (var j = 0; j < vProductColors.length; j++) { | |
if (vProductColors[j].$URL != node.$URL) { | |
if (vProductColors[j].Code == vCode) { | |
alertMessage("配色号" + vCode + "已存在,请重新选择!"); | |
cn.changeAttribute("UR_Colorway_BaseColor", "ref", ac.oldValue); | |
return; | |
} | |
} | |
} | |
} | |
cn.changeAttributeExp("ColorSpecification", "UR_Colorway_BaseColor", true); | |
cn.changeAttributeExp("Code", "enumValue(UR_Colorway_BaseColor.UR_ColorSpec_MiddleType)", true); | |
cn.changeAttributeExp("CodeN", "UR_Colorway_BaseColor.UR_ColorSpec_ClothCode2", true); //新配色号 赋值逻辑 王龙 20220913 | |
cn.changeAttributeExp("Node Name", "UR_Colorway_BaseColor.UR_ColorSpec_ColorName", true); | |
//cn.changeAttributeExp("UR_Colorway_StyleColor", "ref(null)", true); | |
cn.changeAttributeExp("Images", "ColorSpecification.Images", true); | |
} | |
return true; | |
}); | |
//电商组货,调整建议深度值后,重新计算建议的组货等级 | |
api.watchAttribute("MCProduct","C8_MCP_AdjustingDepth", function (ac, cn, node, id){ | |
var locationNode = routerStore.locationNode; | |
var monthNode = null; | |
if(locationNode.$Type=="MarketingLook" && locationNode.PrimaryCollection){ | |
monthNode = getNode(ac,locationNode.PrimaryCollection); | |
}else if(locationNode.$Type=="MarketingCollection"){ | |
monthNode = locationNode; | |
} | |
var weekURL = ac.widget.urlRoot; | |
var weekNode = null; | |
if(weekURL && weekURL !="" && weekURL != "centric:"){ | |
weekNode = getNode(ac,weekURL); | |
} | |
if(monthNode && monthNode.C8_MC_Channel=="UR_enum_Channel:B" && weekNode && weekNode.$Type=="MarketingLook"){ | |
var controlRuleKeys = searchControlRules(monthNode); | |
var skcsData = getDianShangGroupSKCData(ac,[node.$URL], controlRuleKeys, false);//传递MCP的URL | |
if(skcsData && skcsData.list && skcsData.list[node.C8_MCP_SKC]){ | |
var skcNode = skcsData.list[node.C8_MCP_SKC]; | |
var skcCategoryKey = skcNode.categoryKey; | |
skcCategoryKey = skcCategoryKey.substring(0, skcCategoryKey.length-1); | |
var minQty = node.C8_MCP_SpecialLowDepth; | |
if(ac.newValue>=minQty){ | |
var suggestClass = getClassLevel(ac.newValue,skcCategoryKey,searchTargetTableDianShang(weekNode)); | |
if(suggestClass){ | |
cn.changeAttribute("C8_MCP_AdjustingLevel","enum","UR_enum_DSLevel:"+suggestClass); | |
} | |
}else{ | |
ac.newValue = ac.oldValue; | |
cn.changeAttribute("C8_MCP_AdjustingDepth","integer",ac.oldValue); | |
jp.warning("调整深度不能低于最低深度!"); | |
} | |
} | |
} | |
//校验国内组货时,D款和大片款超出金额 | |
if(monthNode && monthNode.C8_MC_Channel=="UR_enum_Channel:DO"){ | |
var newQty = ac.newValue; | |
var skcMinQty = node.C8_MCP_SpecialLowDepth;//skc最低深度 | |
var dMinQty = node.C8_MCP_DLowDepth; | |
if(skcMinQty>=dMinQty){ | |
if(ac.newValue<skcMinQty){ | |
ac.newValue = ac.oldValue; | |
cn.changeAttribute("C8_MCP_AdjustingDepth","integer",ac.oldValue); | |
jp.warning("调整深度不能低于SKC最低深度【"+skcMinQty+"】!"); | |
} | |
}else{ | |
if(ac.newValue<dMinQty){ | |
ac.newValue = ac.oldValue; | |
cn.changeAttribute("C8_MCP_AdjustingDepth","integer",ac.oldValue); | |
jp.warning("调整深度不能低于D款大片款最低深度【"+dMinQty+"】!"); | |
} | |
} | |
} | |
//修改调整深度后,直接锁定skc && monthNode && monthNode.C8_MC_Channel=="UR_enum_Channel:DO" | |
if(ac.newValue){ | |
cn.changeAttribute("C8_MCP_SKCLock","boolean",true); | |
} | |
//设置js不缓存 | |
ac.m_writer.setCannotCache(); | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
api.watchAttribute("MCProduct","C8_MCP_AdjustingDepthHy", function (ac, cn, node, id){ | |
if(ac.newValue){ | |
var map = new Map(); | |
var lockMap = new Map(); | |
map[ac.refNodeId] = ac.newValue*node.C8_MCP_Price; | |
lockMap[ac.refNodeId] = true; | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_AdjustingAmountHy", "doublemap", map, true, false); | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_SKCLockhy", "booleanmap", lockMap, true, false); | |
} | |
return true; | |
}); | |
//在更改单款深度指数时,获取对应的指数数值,只有在单号下维护才可以 | |
api.watchAttribute("Style","UR_Style_DepthIndex", function (ac, cn, node, id){ | |
var locationNode = routerStore.locationNode; | |
var monthNode = null; | |
if(locationNode.$Type=="MarketingLook" && locationNode.PrimaryCollection){ | |
monthNode = getNode(ac,locationNode.PrimaryCollection); | |
}else if(locationNode.$Type=="MarketingCollection"){ | |
monthNode = locationNode; | |
} | |
if(monthNode){ | |
//1.获取规则表-组货系数表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
//0621 判断该设计号在几个选款池中 | |
var colors = node.ActiveColorways; | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCProduct") | |
.RefAttr("__Parent__", xml.OP_EQUALS, monthNode.$URL); | |
let orSearch = q.Or(); | |
for(let i=0; i<colors.length;i++){ | |
orSearch.RefAttr("C8_MCP_SKC", xml.OP_EQUALS, colors[i]) | |
} | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
var skc = results.length; | |
//filterRuleTable(ruleTableNode,"I",true,{UR_SDS_CommodityType:node.UR_Style_CommodityType,UR_SDS_Month:monthNode.C8_MC_Month,UR_SID_GroupOrderAattribute:locationNode.C8_ML_WeekOrderAattribute,UR_SDS_StyleIndex:ac.newValue}); | |
var tableRuleS1 = filterRuleTable(ruleTableNode,"I",true,{UR_SDS_CommodityType:node.UR_Style_CommodityType,UR_SDS_StyleIndex:ac.newValue}); | |
if(tableRuleS1 && tableRuleS1.$URL && tableRuleS1.$URL!=""){ | |
var changeValue = tableRuleS1.UR_SDS_StyleCoefficient; | |
var avgDepth = node.UR_Style_MonthAvgDepth; | |
cn.changeAttribute("UR_Style_DepthCoefficient","double",changeValue); | |
node.ProductColors.forEach(function(color){ | |
//ac.m_writer.changeNode(color).changeAttributeExp("C8_CW_InitialSKCDepth","integer("+avgDepth+"*UR_CW_BestBadCoefficient*"+changeValue+")",true); | |
if(skc == 1){ | |
ac.m_writer.changeNode(color).changeAttributeExp("C8_CW_InitialSKCDepth","ifNaN(integer("+avgDepth+"*"+changeValue+"),0)",true); | |
}else if(skc > 1){ | |
ac.m_writer.changeNode(color).changeAttributeExp("C8_CW_InitialSKCDepth","ifNaN(integer("+avgDepth+"*UR_CW_BestBadCoefficient*"+changeValue+"),0)",true); | |
} | |
}); | |
} | |
} | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","C8_CW_DisplayType", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//款指定渠道更新时,自动带到Colorway上的渠道款中 Jarvis 20240531 | |
api.watchAttribute("Style","UR_Style_KNSStyle", function (ac, cn, node, id){ | |
var colorways = node.ActiveColorways; | |
for(var i=0;i<colorways.length;i++){ | |
ac.m_writer.changeNode(colorways[i]).changeAttribute("C8_CW_NSStyle", "enum", ac.newValue); | |
} | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","C8_CW_Special", function (ac, cn, node, id){ | |
var styleNode = getNode(ac, node.__Parent__); | |
if (node.C8_CW_CompleteTime != 0) { | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_CW_DSChangeTag", "boolean", true); | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_CW_HWChangeTag", "boolean", true); | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "特殊款标签确认消息";//主题 | |
var comments = styleNode.$Name + "特殊款标签已修改";//消息文本 | |
var docContainer = styleNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
} | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","C8_CW_DSChangeTag", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","C8_CW_HWChangeTag", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","UR_Colorway_Look1", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","UR_Colorway_Look2", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","UR_Colorway_Look3", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","UR_Colorway_Look4", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","UR_Colorway_Look5", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("Colorway","UR_Colorway_Look6", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("StyleAttributes","UR_StyleAttributes_MiddleCategoryTypeCount", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改标签时,自动刷新数据 | |
api.watchAttribute("StyleAttributes","UR_StyleAttributes_Silhouette", function (ac, cn, node, id){ | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//中品类修改时,发送邮件通知 Jarvis 0620 | |
api.watchAttribute("StyleAttributes","UR_StyleAttributes_MiddleCategoryType", function (ac, cn, node, id){ | |
var styleNode = getNode(ac,node.__Parent__); | |
var subject = "测试:中品类修改消息";//主题 | |
var comments = styleNode.$Name + "中品类已修改";//消息文本 | |
//发送邮件 | |
SendMailToRole(ac,"海外买手",subject,comments,""); | |
SendMailToRole(ac,"电商买手",subject,comments,""); | |
return true; | |
}); | |
//渠道款修改时,发送邮件通知 Jarvis 0620 | |
api.watchAttribute("Colorway","C8_CW_NSStyle", function (ac, cn, node, id){ | |
var styleNode = getNode(ac,node.__Parent__); | |
var subject = "测试:渠道款修改消息";//主题 | |
var comments = styleNode.$Name + "指定渠道款已修改";//消息文本 | |
//发送邮件 | |
SendMailToRole(ac,"海外买手",subject,comments,""); | |
SendMailToRole(ac,"电商买手",subject,comments,""); | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//颜色修改时,发送邮件通知 Jarvis 0620 | |
api.watchAttribute("Colorway","ColorSpecification", function (ac, cn, node, id){ | |
var styleNode = getNode(ac,node.__Parent__); | |
var subject = "测试:颜色修改消息";//主题 | |
var comments = styleNode.$Name + "颜色已修改";//消息文本 | |
//发送邮件 | |
SendMailToRole(ac,"海外买手",subject,comments,""); | |
SendMailToRole(ac,"电商买手",subject,comments,""); | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//在更改单SKC深度指数时,获取对应的指数数值,只有在单号下维护才可以 | |
api.watchAttribute("Colorway","UR_CW_BestBadIndex", function (ac, cn, node, id){ | |
var locationNode = routerStore.locationNode; | |
var monthNode = null; | |
if(locationNode.$Type=="MarketingLook" && locationNode.PrimaryCollection){ | |
monthNode = getNode(ac,locationNode.PrimaryCollection); | |
}else if(locationNode.$Type=="MarketingCollection"){ | |
monthNode = locationNode; | |
} | |
if(monthNode){ | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
var styleNode = ac.m_cache.addNode(node.Style); | |
//0621 判断该设计号在几个选款池中 | |
var colors = styleNode.ActiveColorways; | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCProduct") | |
.RefAttr("__Parent__", xml.OP_EQUALS, monthNode.$URL); | |
let orSearch = q.Or(); | |
for(let i=0; i<colors.length;i++){ | |
orSearch.RefAttr("C8_MCP_SKC", xml.OP_EQUALS, colors[i]) | |
} | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
var skc = results.length; | |
var avgDepth = styleNode.UR_Style_MonthAvgDepth; | |
var depthIndex = styleNode.UR_Style_DepthCoefficient; | |
//filterRuleTable(ruleTableNode,"I",true,{UR_SDS_CommodityType:styleNode.UR_Style_CommodityType,UR_SDS_Month:monthNode.C8_MC_Month,UR_SID_GroupOrderAattribute:locationNode.C8_ML_WeekOrderAattribute,UR_SDS_StyleIndex:ac.newValue}); | |
var tableRuleS1 = filterRuleTable(ruleTableNode,"I",true,{UR_SDS_CommodityType:styleNode.UR_Style_CommodityType,UR_SDS_SKCIndex:ac.newValue}); | |
if(tableRuleS1 && tableRuleS1.$URL && tableRuleS1.$URL!=""){ | |
var changeValue = tableRuleS1.UR_SDS_SKCCoefficient; | |
cn.changeAttribute("UR_CW_BestBadCoefficient","double",changeValue); | |
if(skc == 1){ | |
cn.changeAttributeExp("C8_CW_InitialSKCDepth","ifNaN(integer("+avgDepth+"*"+depthIndex+"),0)",true); | |
}else if(skc > 1){ | |
cn.changeAttributeExp("C8_CW_InitialSKCDepth","ifNaN(integer("+avgDepth+"*"+depthIndex+"*"+changeValue+"),0)",true); | |
} | |
} | |
} | |
ac.bRefreshNode = true; | |
}); | |
//电商组货,更改D款时,获取对应的最低深度 | |
api.watchAttribute("Colorway","C8_CW_DSSpecial", function (ac, cn, node, id){ | |
var locationNode = routerStore.locationNode; | |
var monthNode = null; | |
if(locationNode.$Type=="MarketingLook" && locationNode.PrimaryCollection){ | |
monthNode = getNode(ac,locationNode.PrimaryCollection); | |
}else if(locationNode.$Type=="MarketingCollection"){ | |
monthNode = locationNode; | |
} | |
if(monthNode && monthNode.C8_MC_Channel=="UR_enum_Channel:B"){ | |
var mcpURL = ac.refNodeId; | |
if(mcpURL && mcpURL!="centric:"){ | |
var mcpNode = getNode(ac,mcpURL); | |
if(mcpNode && mcpNode.$Type=="MCProduct"){ | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
var minQty = 0; | |
var styleNode = getNode(ac,node.__Parent__); | |
var styleAttNode = getNode(ac,styleNode.Attributes); | |
var category = styleNode.UR_Style_ProductLargeType; //品类 | |
var midCategory = getEnumValue(styleAttNode.UR_StyleAttributes_MiddleCategoryTypeCount); //中品类 | |
if(midCatMapping.has(midCategory)){//中品类转换 | |
midCategory = midCatMapping.get(midCategory); | |
} | |
midCategory = "UR_enum_ProductMiddleType:" + midCategory; | |
var commodityType = styleNode.UR_Style_CommodityType; | |
if(ac.newValue=="UR_enum_Special:SD"){ | |
//改为D款,读取K表,获取最低深度 20240409 新增商品层、品类、中品类过滤 | |
var tableRuleK = filterRuleTable(ruleTableNode,"K",true,{UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_CommodityType:commodityType,UR_SDS_ProductLargeType:category,UR_SDS_MiddleCategoryType:midCategory}); | |
if(tableRuleK && tableRuleK.$URL && tableRuleK.$URL!=""){ | |
minQty = tableRuleK.UR_SDS_DLowDepth; | |
} | |
}else{ | |
//改为普通款,读取X表,获取最低深度 20240409 新增订单属性、商品层、风格、电商级别过滤 | |
var tableRuleX = filterRuleTable(ruleTableNode,"X",true,{UR_SDS_GroupOrderAattribute:monthNode.C8_MC_MonthOrderAattribute,UR_SDS_CommodityType:commodityType,UR_SDS_ProductStyle:monthNode.C8_MC_Style,UR_SDS_DSLevel:mcpNode.C8_MCP_SuggestedLevel,UR_SDS_ProductLargeType:category,UR_SDS_MiddleCategoryType:midCategory}); | |
if(tableRuleX && tableRuleX.$URL && tableRuleX.$URL!=""){ | |
minQty = tableRuleX.UR_SDS_LowDepth; | |
} | |
} | |
ac.m_writer.changeNode(mcpURL).changeAttribute("C8_MCP_SpecialLowDepth","integer",minQty); | |
var mcpAdjustDeep = mcpNode.C8_MCP_AdjustingDepth; | |
if(mcpAdjustDeep<minQty){ | |
ac.m_writer.changeNode(mcpURL).changeAttributeFlag("C8_MCP_AdjustingDepth", xml.ATTR_FLAG_DISABLE_EXPRESSION, true, false) | |
.changeAttribute("C8_MCP_AdjustingDepth","integer",minQty); | |
} | |
} | |
} | |
} | |
ac.bRefreshNode = true; | |
}); | |
//应急单唯一码选择 | |
api.watchAttribute("Colorway","UR_Colorway_GroUnCode2", function (ac, cn, node, id){ | |
if(ac.newValue != "centric:"){ | |
var competiveStyleNew = ac.m_cache.getNode(ac.newValue, true); | |
ac.m_writer.changeNode(competiveStyleNew.$URL).changeAttribute("C8_CStyle_Selected", "boolean", true); | |
ac.bRefreshNode = true; | |
return true; | |
} | |
if(ac.oldValue != "centric:"){ | |
var competiveStyleOld = ac.m_cache.getNode(ac.oldValue, true); | |
ac.m_writer.changeNode(competiveStyleOld.$URL).changeAttribute("C8_CStyle_Selected", "boolean", false); | |
ac.bRefreshNode = true; | |
return true; | |
} | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//选款确认 | |
api.watchAttribute("Colorway","Active", function (ac, cn, node, id){ | |
var styleNode = getNode(ac,node.__Parent__); | |
var styleAttNode = getNode(ac,styleNode.Attributes); | |
debugger | |
if(ac.newValue){ | |
//勾选 | |
if (!node.UR_Colorway_BaseColor || node.UR_Colorway_BaseColor == 'centric:') { | |
cn.changeAttribute("Active", "boolean", false); | |
jp.warning("基础颜色不能为空"); | |
return; | |
} | |
if (!node.UR_Colorway_IsEnable) { | |
cn.changeAttribute("Active", "boolean", false); | |
jp.warning("是否启用应该为true"); | |
return; | |
} | |
var IPSection = styleAttNode.UR_StyleAttributes_IPSection.replace("UR_enum_IPSection:","") | |
if (!IPSection) { | |
cn.changeAttribute("Active", "boolean", false); | |
jp.warning("IP款不能为空"); | |
return; | |
} | |
var IPElement = styleAttNode.UR_StyleAttributes_IPElement.replace("UR_enum_IPElement:","") | |
if (IPSection!="00" && !IPElement) { | |
cn.changeAttribute("Active", "boolean", false); | |
jp.warning("当IP款为非“非IP款”时,IP元素不能为空"); | |
return; | |
} | |
var MiddleCategoryType = styleAttNode.UR_StyleAttributes_MiddleCategoryType.replace("UR_enum_ProductMiddleType:","") | |
if (!MiddleCategoryType) { | |
cn.changeAttribute("Active", "boolean", false); | |
jp.warning("中品类不能为空"); | |
return; | |
} | |
var BasicUnit = styleAttNode.UR_StyleAttributes_BasicUnit.replace("UR_enum_Unit:","") | |
if (!BasicUnit) { | |
cn.changeAttribute("Active", "boolean", false); | |
jp.warning("基本单位不能为空"); | |
return; | |
} | |
// var FabricProperties = styleAttNode.UR_StyleAttributes_FabricProperties.replace("UR_enum_ProductMiddleType:","") // 缺少字段 | |
// if (!MiddleCategoryType) { | |
// cn.changeAttribute("Active", "boolean", false); | |
// jp.warning("面料特性不能为空"); | |
// return; | |
// } | |
// var Silhouette = styleAttNode.UR_StyleAttributes_Silhouette.replace("UR_enum_ProfileType:","") | |
// if (!Silhouette) { | |
// cn.changeAttribute("Active", "boolean", false); | |
// jp.warning("子品类不能为空"); | |
// return; | |
// } | |
//暂时关闭感审判断 | |
// var GSJG = styleAttNode.UR_StyleAttributes_GSJG.replace("UR_enum_GSJG:","") | |
// if (!GSJG || GSJG == "not_pass") { | |
// cn.changeAttribute("Active", "boolean", false); | |
// jp.warning("感审结果不能为空且不能为“不通过”"); | |
// return; | |
// } | |
}else{ | |
//取消勾选 | |
if (node.C8_CW_DSDepth && node.C8_CW_DSDepth > 0) { | |
cn.changeAttribute("Active", "boolean", true); | |
jp.warning("电商组货深度>0,不能取消"); | |
return; | |
} | |
if (node.C8_CW_GNDepth && node.C8_CW_GNDepth > 0) { | |
cn.changeAttribute("Active", "boolean", true); | |
//查询skc被组货在哪个月份 | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MarketingCollection") | |
.RefAttr("C8_MCP_SKC", xml.OP_EQUALS, node.$URL, "Child:Products"); | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if(results.length > 0){ | |
var monthName =""; | |
for(var i=0; i<results.length; i++){ | |
monthName = monthName + results[i].$Name + "、"; | |
} | |
if(monthName.length > 0){ | |
monthName = monthName.substring(0, monthName.length-2); | |
} | |
jp.alert("国内组货深度>0,不能取消! 查询到该SKC被组货到:‘" + monthName + "’中,请取消对应月份中的该SKC组货"); | |
}else{ | |
jp.alert("国内组货深度>0,不能取消! 未查询到对应组货SKC,请联系管理员处理数据将国内组货深度置0"); | |
} | |
return; | |
} | |
if (node.C8_CW_HWDepth && node.C8_CW_HWDepth > 0) { | |
cn.changeAttribute("Active", "boolean", true); | |
jp.warning("海外组货深度>0,不能取消"); | |
return; | |
} | |
if (styleAttNode.UR_StyleAttributes_hasOrder) { | |
cn.changeAttribute("Active", "boolean", true); | |
jp.warning("该款的是否下单为true,不能取消"); | |
return; | |
} | |
} | |
//字段是否可编辑变更 | |
ac.m_writer.changeNode(node.$URL).changeAttributeFlag("UR_Colorway_BaseColor", xml.ATTR_FLAG_NOEDIT, ac.newValue, true);//基础颜色 | |
ac.m_writer.changeNode(node.$URL).changeAttributeFlag("UR_Colorway_IsEnable", xml.ATTR_FLAG_NOEDIT, ac.newValue, true);//是否启用 | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_MiddleCategoryType", xml.ATTR_FLAG_NOEDIT, ac.newValue, true);//中品类 | |
// ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_FabricProperties", xml.ATTR_FLAG_NOEDIT, ac.newValue, true);//面料特性 缺 | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_Silhouette", xml.ATTR_FLAG_NOEDIT, ac.newValue, true);//子品类 | |
ac.bRefreshNode = true; | |
return true; | |
}); | |
//修改组货单价时,自动带入price到MCP上 | |
api.watchAttribute("StyleAttributes","UR_StyleAttributes_GroupCarPrice", function (ac, cn, node, id){ | |
var mcpURL = ac.refNodeId; | |
if(mcpURL && mcpURL!="centric:") { | |
var mcpNode = getNode(ac, mcpURL); | |
if (mcpNode && mcpNode.$Type == "MCProduct") { | |
var newPrice = getEnumValue(ac.newValue); | |
if (!newPrice || newPrice === "") { | |
newPrice = "0"; | |
} | |
var intPrice = parseInt(newPrice); | |
ac.m_writer.changeNode(mcpURL).changeAttribute("C8_MCP_Price", "double", intPrice); | |
var styleNode = getNode(ac, node.__Parent__); | |
var colorways = styleNode.ActiveColorways; | |
for (var i = 0; i < colorways.length; i++) { | |
var colorwayNode = getNode(ac, colorways[i]); | |
if (colorwayNode.C8_CW_CompleteTime != 0) { | |
ac.m_writer.changeNode(colorwayNode.$URL).changeAttribute("C8_CW_DSChangeTag", "boolean", true); | |
ac.m_writer.changeNode(colorwayNode.$URL).changeAttribute("C8_CW_HWChangeTag", "boolean", true); | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "测试:组货单价修改消息";//主题 | |
var comments = styleNode.$Name + "组货单价已修改";//消息文本 | |
var docContainer = styleNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手",subject,comments,""); | |
SendMailToRole(ac,"电商买手",subject,comments,""); | |
} | |
} | |
} | |
} | |
ac.bRefreshNode = true; | |
}); | |
//国内组货确认 | |
//force=强制确认, checkOnly=检核 | |
function ConfirmGuoNeiZH(ac,force,checkOnly,flag){ | |
var weekURL = ac.m_urlParent; | |
printLog("========开始执行时间========"); | |
var weekNode = getNode(ac,weekURL); | |
var isLastWeek = weekNode.UR_ML_IsLastOrder; | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
if(orderType && (orderType==="E" || orderType==="F" || orderType==="T") && !checkOnly){ | |
//如果是应急单,则组货确认时,不做检查,等同于强制确认 | |
force = true; | |
} | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
//2.获取目标表 | |
var targetTableNode = searchTargetTable(weekNode); | |
printLog("获取规则表,目标表完成"); | |
//3.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().store._allResultUrls; | |
var skcsData = getAndGroupSKCData(ac,resultURLs, controlRuleKeys); | |
//错误信息声明 | |
var errMsg = []; | |
var checkErrors = skcsData.errors; | |
if(checkErrors && checkErrors.length>0){ | |
errMsg.push(checkErrors.join("</BR>")); | |
} | |
var checkPriceAndDeepErrors = skcsData.finalConfirmError; | |
if(!force && checkPriceAndDeepErrors && checkPriceAndDeepErrors.length>0){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",checkPriceAndDeepErrors.join("</BR>")); | |
jp.alert("发现如下错误信息:</BR>"+checkPriceAndDeepErrors.join("</BR>")); | |
return true; | |
} | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
if(orderType && (orderType==="E" || orderType==="F" || orderType==="T")){ | |
//如果是应急单,则组货确认时,不做检查,等同于强制确认 | |
force = true; | |
} | |
//4常销款、基本款SKC个数校验,价格带校验 规则表1#和9# | |
var checkTypes = ["R","B"]; | |
//(errMsg,checkTypes,skcsData,ruleTableNode,weekNode,monthNode) | |
checkSKCCountAndPriceList(errMsg,checkTypes,skcsData,ruleTableNode,weekNode,monthNode); | |
//5按照周目标获取组货宽度、组货金额等目标值, 确认是否需要按照款式宽度校验 | |
//5.1.检查主题款look数量和skc数量 | |
var modsObj = skcsData.S.mods; | |
var modList = Object.keys(modsObj); | |
//表1#=SKC标准及LOOK套数的标准值&组货系数 | |
checkSKCLookCount(errMsg,true,modList,modsObj,skcsData,ruleTableNode,weekNode,monthNode); | |
//5.2按照周目标检核所有品类的组货情况 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
if(!weekTargetNode){ | |
errMsg.push("找不到" + key + "对应目标!"); | |
}else{ | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var monthTargetDisplay = getMonthTargetKey(monthTargetNode,true,false);//非电商 | |
if(isLastWeek){ | |
monthTargetDisplay = "最后一单:"+monthTargetDisplay; | |
} | |
//校验总宽度 | |
var totalSkcCount = skcsData.skcIds.length; | |
var mcNode = targetTableNode.mcTarget[key]; | |
var mcSKCUpper = mcNode.C8_MC_ExcessSKC; | |
var mcSKCBottom = mcNode.C8_MC_ReduceSKC; | |
//校验宽度:大于月总SKC上限 | |
if(totalSkcCount>mcSKCUpper){ | |
errMsg.push("本单的实际组货宽度为【"+totalSkcCount+"】,【大于】月目标的剩余组货宽度上限:【"+mcSKCUpper+"】"); | |
} | |
//组货宽度 | |
var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
var weekSKCUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//周 可超宽度剩余C8_MCMC_ExcessSKCRemaining | |
var weekSKCDepthTarget = weekSKCTarget+weekSKCUpperTarget; | |
var monthSKCDepthUpper = monthTargetNode.C8_MCM_ExcessSKC; | |
var monthSKCDepthButtom = monthTargetNode.C8_MCM_ReduceSKC; | |
var catSkcCount = skcsData.prodCatSkcs[key.substring(0,3)].skcs; //组货内skc数量 | |
//校验宽度:大于月品类组货SKC上限 | |
if(catSkcCount>monthSKCDepthUpper){ | |
errMsg.push(monthTargetDisplay+"的实际组货宽度为【"+catSkcCount+"】,【大于】月品类目标的剩余组货宽度上限:【"+monthSKCDepthUpper+"】"); | |
} | |
if(skcsData.categoryKey[key]){//&& weekSKCDepthTarget>0 取消判断目标深度 | |
var catKeyNode = skcsData.categoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
var categorySKCList = catKeyNode.list; | |
// 周 组货金额 | |
var weekGroupGoodsAmount = weekTargetNode.C8_MCMC_GroupGoodsAmount //周企划金额 | |
var isLastOrder = weekTargetNode.UR_MCMC_IsLastOrder //是否月末单号 | |
var monthFinishAmount = monthTargetNode.C8_MCM_MonthGroupGoodsAmount;//月已组货金额 | |
var monthPlanAmount = monthTargetNode.C8_MCM_PlannedAmount;//月企划金额 | |
var weekGroupGoodsAmountFinish = weekTargetNode.C8_MCMC_GroupGoodsAmountFinish;//周已组货金额 | |
//组货金额 (月) | |
var monthCanOverseedAmout = monthTargetNode.C8_MCM_ExcessAmountRemaining; //月可超金额剩余 | |
var monthExcessAmount = monthTargetNode.C8_MCM_ExcessAmount; //月可超总金额 | |
var monthUseGroupGoodsAmount = 0; //月已使用企划金额 | |
var weekAmount = weekTargetNode.C8_MCMC_GroupGoodsAmount; //周目标组货金额 | |
var monthCanDeduceAmount = monthTargetNode.C8_MCM_ReduceAmountRemaining; //月可减金额剩余 | |
var monthReduceAmount = monthTargetNode.C8_MCM_ReduceAmount; //月可减总金额 | |
//组货金额上限= 月企划总金额+月可超金额-月已组货金额 | |
var weekFinalCheckAmountUpper = monthPlanAmount+monthCanOverseedAmout-monthFinishAmount; | |
//组货金额下限=月企划总金额-月可减金额-月已组货金额 | |
var weekFinalCheckAmountLower = monthPlanAmount-monthCanDeduceAmount-monthFinishAmount; | |
var nowWeekNode = getNode(ac,weekTargetNode.C8_MCMC_Week); | |
var nowWeek = getEnumValue(nowWeekNode.C8_ML_Week); | |
var colors = monthTargetNode.Colors; | |
//前面单号的企划总金额 | |
var preOrder = 0; | |
//前面单号的已用总金额 | |
var preUseOrder = 0; | |
for(var i=0;i<colors.length;i++){ | |
if(colors[i] == weekTargetNode.$URL){//循环为周自己本身则要跳出循环 | |
continue; | |
} | |
var mcMaterialColorNode = getNode(ac,colors[i]); | |
var marketingLookNode = getNode(ac,mcMaterialColorNode.C8_MCMC_Week); | |
//如果是月末 则要判断前面单号是否都检核 | |
if(isLastWeek){ | |
if(marketingLookNode.C8_ML_Status != "UR_ZHStatus:Lock" && marketingLookNode.C8_ML_Status != "UR_ZHStatus:Complete"){ | |
jp.alert(monthTargetDisplay+"检核月末单号时,必须前面单号都已经检核完成!"); | |
return true; | |
} | |
} | |
if((marketingLookNode.C8_ML_Status == "UR_ZHStatus:Lock") || (marketingLookNode.C8_ML_Status == "UR_ZHStatus:Complete")){ | |
preOrder = preOrder + mcMaterialColorNode.C8_MCMC_GroupGoodsAmount; | |
preUseOrder = preUseOrder + mcMaterialColorNode.C8_MCMC_GroupGoodsAmountFinish; | |
} | |
} | |
//上限 | |
var upAmout = weekGroupGoodsAmount + preOrder - preUseOrder + monthExcessAmount + weekTargetNode.C8_MCMC_DAmountFinish; //上限 当前周企划金额+已使用的周企划金额 - 已实际组货金额+上限 | |
//非最后一单下限 | |
var reduceAmout = weekGroupGoodsAmount + preOrder - preUseOrder - monthReduceAmount; //下限 当前周企划金额+已使用的周企划金额 - 已实际组货金额-下限 | |
//最后一单下限 | |
var lastOrderAmountLower = weekGroupGoodsAmount + preOrder - preUseOrder;//当前单企划的+已组货的企划的-已组的实际金额 | |
//月可超剩余 | |
monthCanOverseedAmout = weekTargetNode.C8_MCMC_GroupGoodsAmount - weekTargetNode.C8_MCMC_GroupGoodsAmountFinish + monthTargetNode.C8_MCM_ReduceAmount; | |
//月可减剩余 | |
monthReduceAmount = monthTargetNode.C8_MCM_ReduceAmount - (weekTargetNode.C8_MCMC_GroupGoodsAmount - weekTargetNode.C8_MCMC_GroupGoodsAmountFinish); | |
if(weekGroupGoodsAmountFinish != 0) { | |
if (isLastWeek) {//月末单 | |
if (lastOrderAmountLower <= weekGroupGoodsAmountFinish && weekGroupGoodsAmountFinish <= upAmout) { | |
printLog(monthTargetDisplay + "的月末单号条件满足!"); | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAmount", "double", monthFinishAmount);//月已组货金额 | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_ExcessAmountRemaining", "double", monthCanOverseedAmout);//月可超剩余 | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_ReduceAmountRemaining", "double", monthReduceAmount);//月可减剩余 | |
} else { | |
errMsg.push(monthTargetDisplay + "的单号组货金额【" + weekGroupGoodsAmountFinish + "】,【不符合】周目标滚动的组货金额上下限:【" + lastOrderAmountLower + "-" + upAmout + "】"); | |
} | |
////校验宽度:小于月品类组货SKC下限 | |
if(catSkcCount<monthSKCDepthButtom){ | |
errMsg.push(monthTargetDisplay+"的实际组货宽度为【"+catSkcCount+"】,【小于】月品类目标的剩余组货宽度下限:【"+monthSKCDepthButtom+"】"); | |
} | |
//校验宽度:小于月总SKC下限 | |
if(totalSkcCount<mcSKCBottom){ | |
errMsg.push("本单的实际组货宽度为【"+totalSkcCount+"】,【小于】月目标的剩余组货宽度下限:【"+mcSKCBottom+"】"); | |
} | |
} else { | |
if (reduceAmout <= weekGroupGoodsAmountFinish && weekGroupGoodsAmountFinish <= upAmout) { | |
printLog(monthTargetDisplay + "的月末单号条件满足!"); | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAmount", "double", monthFinishAmount);//月已组货金额 | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_ExcessAmountRemaining", "double", monthCanOverseedAmout);//月可超剩余 | |
ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_ReduceAmountRemaining", "double", monthReduceAmount);//月可减剩余 | |
} else { | |
errMsg.push(monthTargetDisplay + "的单号组货金额【" + weekGroupGoodsAmountFinish + "】,【不符合】周目标滚动的组货金额上下限:【" + reduceAmout + "-" + upAmout + "】"); | |
} | |
} | |
} | |
//组货平均价 | |
var weekAvgPriceTargetLower = monthTargetNode.C8_MCM_AvgPriceLow; | |
var weekAvgPriceTargetUpper = monthTargetNode.C8_MCM_AvgPriceHigh; | |
//只检查常销款和基本款, 主题款的校验在上一步执行 | |
if(!key.startsWith("S")){ | |
//平均价校验 | |
if(skcAvgPrice<weekAvgPriceTargetLower || skcAvgPrice>weekAvgPriceTargetUpper){ | |
errMsg.push(monthTargetDisplay+"的组货平均价【"+skcAvgPrice+"】,【不符合】月目标的组货平均价上下限:【"+weekAvgPriceTargetLower+"-"+weekAvgPriceTargetUpper+"】"); | |
} | |
} | |
// if(isLastWeek){ | |
////校验金额 | |
// if(finalAmount>upAmout || finalAmount<reduceAmout){ | |
////errMsg.push("月最后一单:"+monthTargetDisplay+"的实际组货金额为【"+finalAmount+"】,【不符合】月组货金额目标的可减后总金额【"+weekFinalCheckAmountLower+"】和月可超总金额:【"+weekFinalCheckAmountUpper+"】的区间要求"); | |
// errMsg.push("月最后一单:"+monthTargetDisplay+"的实际组货金额为【"+finalAmount+"】,【不符合】月组货金额目标的可减后总金额【"+reduceAmout+"】和月可超总金额:【"+upAmout+"】的区间要求"); | |
// } | |
// }else{ | |
////校验金额 | |
// if(finalAmount>weekFinalCheckAmountUpper){ | |
// errMsg.push("非最后一单:"+monthTargetDisplay+"的实际组货金额为【"+finalAmount+"】,【超出】月组货金额目标加可超金额总和:【"+weekFinalCheckAmountUpper+"】的要求"); | |
// } | |
// } | |
/* 改到确认通过时写入 20240321 | |
//将结果写入SKC上,国内组货深度,组货单号 | |
categorySKCList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_GNDepth","integer",skcNode.finalQty) | |
.changeAttribute("C8_CW_GNSelected","boolean",true) | |
.changeAttribute("UR_CW_GroupBillNo","ref",weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
if(orderType == "N"){//计划单 | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
}else{ | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
} | |
}); */ | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish","double",finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",finalQty);//组货深度 | |
}else{ | |
if(weekSKCDepthTarget>0){ | |
errMsg.push(monthTargetDisplay+"的组货目标存在,但是没有找到任何对应的实际组货SKC!周组货宽度目标【"+weekSKCDepthTarget+"】"); | |
} | |
} | |
} | |
}); | |
//Agnes 更新弱管控品类目标 | |
Object.keys(targetTableNode.weakWeekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
var weekSKCUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//周 可超宽度剩余C8_MCMC_ExcessSKCRemaining | |
var weekSKCDepthTarget = weekSKCTarget+weekSKCUpperTarget; | |
if(skcsData.weakCategoryKey[key]&& weekSKCDepthTarget>0) { | |
var catKeyNode = skcsData.weakCategoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish", "double", finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "integer", skcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish", "integer", styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "integer", finalQty);//组货深度 | |
} | |
}); | |
//更新单号组货完成状态 | |
if(errMsg.length==0 || force){ | |
if(!checkOnly){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete");//组货结果状态 | |
//确认时校验通过后更新周组货skc (检核时不写入,以便能重复校验) 20230315 | |
Object.keys(targetTableNode.weekTarget).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
var weekTargetURL = weekTargetNode.$URL; | |
var catKeyNode = skcsData.categoryKey[key]; | |
if(catKeyNode && catKeyNode.skcs > 0){ | |
var skcCount = catKeyNode.skcs; | |
ac.m_writer.changeNode(weekTargetURL) | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",skcCount);//组货宽度 | |
} | |
}); | |
//将结果写入SKC上,国内组货深度,组货单号 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
var categorySKCList = catKeyNode.list; | |
if(categorySKCList != undefined) { | |
categorySKCList.forEach(function (skcId) { | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_GNDepth", "integer", skcNode.finalQty) | |
.changeAttribute("C8_CW_GNSelected", "boolean", true) | |
.changeAttribute("UR_CW_GroupBillNo", "ref", weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
// if(orderType == "N"){//计划单 | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
// }else{ | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
// } | |
//0521 不分渠道 都取UR_Colorway_PLMUniqueValue | |
var urSkcNode = getNode(ac, skcId); | |
if (urSkcNode.UR_Colorway_OKCode == "") { | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode", "UR_Colorway_PLMUniqueValue", true); | |
} | |
}); | |
} | |
}); | |
} | |
//ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
if(errMsg.length>0){ | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
}else{ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
} | |
var successMsg = ""; | |
if(checkOnly){ | |
successMsg = "数据检核通过!请点击【组货确认】以完成组货!"; | |
}else{ | |
successMsg = "组货确认完成!" | |
flag = true; | |
} | |
jp.alert(successMsg); | |
}else{ | |
if(errMsg.length>0){ | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
}else{ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
} | |
jp.alert("执行校验出现错误,请检查:</BR>"+errMsg.join("</BR>")); | |
} | |
return flag; | |
} | |
//国内组货确认 | |
//force=强制确认, checkOnly=检核 | |
function ConfirmGuoNeiZHV2(ac,force,checkOnly,flag,isDesignerStyle){ | |
var currentNode = routerStore.locationNode; | |
var weekURL = ac.m_urlParent; | |
printLog("========开始执行时间========"); | |
var weekNode = getNode(ac,weekURL); | |
var isLastWeek = weekNode.UR_ML_IsLastOrder; | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
if(orderType && (orderType==="E" || orderType==="F" || orderType==="T") && !checkOnly){ | |
//如果是应急单,则组货确认时,不做检查,等同于强制确认 | |
force = true; | |
} | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
//2.获取目标表 | |
var targetTableNode = searchTargetTable(weekNode); | |
printLog("获取规则表,目标表完成"); | |
//3.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().store._allResultUrls; | |
var skcsData = getAndGroupSKCDataV2(ac,resultURLs, controlRuleKeys); | |
//错误信息声明 | |
var errMsg = []; | |
var checkErrors = skcsData.errors; | |
if(checkErrors && checkErrors.length>0){ | |
errMsg.push(checkErrors.join("</BR>")); | |
} | |
var checkPriceAndDeepErrors = skcsData.finalConfirmError; | |
if(!force && checkPriceAndDeepErrors && checkPriceAndDeepErrors.length>0){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",checkPriceAndDeepErrors.join("</BR>")); | |
jp.alert("发现如下错误信息:</BR>"+checkPriceAndDeepErrors.join("</BR>")); | |
return true; | |
} | |
//20240418 新增重置周组货结果 | |
Object.keys(targetTableNode.weekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",0)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",0)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",0)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",0)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",0);//组货深度 | |
}); | |
Object.keys(targetTableNode.weakWeekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",0)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",0)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",0)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",0)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",0);//组货深度 | |
}); | |
var targetSkcs = targetTableNode.weekSkcs; //周目标总skc | |
var targetAmount = targetTableNode.weekAmount; //周目标总金额 | |
var zhSkcs = skcsData.skcIds.length; //实际周组货skc宽度 | |
var zhAmount = skcsData.amount; //周实际组货金额 | |
var weekSkcsFloatUpper = 1; | |
var weekSkcsFloatLower = 1; | |
var monthSkcsFloatUpper = 1; | |
var monthSkcsFloatLower = 1; | |
var weekAmountFloatUpper = 1; | |
var weekAmountFloatLower = 1; | |
var monthAmountFloatUpper = 1; | |
var monthAmountFloatLower = 1; | |
var monthAvgPriceFloatUpper = 1; | |
var monthAvgPriceFloatLower = 1; | |
//获取规则表7:组货金额、宽度、平均单价上下限检核条件 | |
var ruleTable7 = filterRuleTable(ruleTableNode, "7", false, null); | |
ruleTable7.forEach(function(ruleNode){ | |
if(ruleNode.UR_SDS_Dimension == "UR_enum_Dimension:组货金额"){ | |
weekAmountFloatUpper = ruleNode.UR_SDS_BillUpperRate; | |
weekAmountFloatLower = ruleNode.UR_SDS_BillLowerRate; | |
monthAmountFloatUpper = ruleNode.UR_SDS_MonthUpperRate; | |
monthAmountFloatLower = ruleNode.UR_SDS_MonthLowerRate; | |
}else if(ruleNode.UR_SDS_Dimension == "UR_enum_Dimension:组货宽度"){ | |
weekSkcsFloatUpper = ruleNode.UR_SDS_BillUpperRate; | |
weekSkcsFloatLower = ruleNode.UR_SDS_BillLowerRate; | |
monthSkcsFloatUpper = ruleNode.UR_SDS_MonthUpperRate; | |
monthSkcsFloatLower = ruleNode.UR_SDS_MonthLowerRate; | |
}else if(ruleNode.UR_SDS_Dimension == "UR_enum_Dimension:平均单价"){ | |
monthAvgPriceFloatUpper = ruleNode.UR_SDS_MonthUpperRate; | |
monthAvgPriceFloatLower = ruleNode.UR_SDS_MonthLowerRate; | |
} | |
}); | |
//设计师系列前三单不管控,最后一单卡控月度总金额 | |
if(isDesignerStyle){ | |
var monthGroupedAmount = targetTableNode.monthGroupedAmount; //月度已组金额(汇总非最后一单的所有单已组金额) | |
var monthPlannedAmount = targetTableNode.monthPlanAmount; //月企划总金额 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
if(!weekTargetNode){ | |
var commodityName = locale.getEnumName("UR_enum_CommodityType:"+key.substring(0,1)) | |
var catEnum = (key.length>=3 ? key.substring(1,3) : ""); | |
var catName = locale.getEnumName("UR_enum_ProductLargeType:"+catEnum); | |
var midCatEnum = (key.length>=5 ? key.substring(3,5) : ""); | |
var midCatName = locale.getEnumName("UR_enum_ProductMiddleType:"+midCatEnum); | |
var subCatEnum = (key.length>=7 ? key.substring(5,7) : ""); | |
var subCatName = locale.getEnumName("UR_enum_ProfileType:"+subCatEnum); | |
var keyDisplay = "【"+commodityName+"】【"+catName+"】【"+midCatName+"】【"+subCatName+"】"; | |
errMsg.push("找不到" + keyDisplay + "对应目标!"); | |
}else{ | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var monthTargetDisplay = getMonthTargetKey(monthTargetNode,true,false);//非电商 | |
if(isLastWeek){ | |
monthTargetDisplay = "最后一单:"+monthTargetDisplay; | |
} | |
if(skcsData.categoryKey[key]){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var catSkcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",catSkcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_DAmountFinish","double",finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",finalQty);//组货深度 | |
}else{ | |
if(weekSKCDepthTarget>0){ | |
errMsg.push(monthTargetDisplay+"的组货目标存在,但是没有找到任何对应的实际组货SKC!周组货宽度目标【"+weekSKCDepthTarget+"】"); | |
} | |
} | |
} | |
}); | |
if(isLastWeek){//20240408 设计单最后一单校验月总金额 Agnes | |
var monthTargetAmountUpper = Math.round(monthPlannedAmount*monthAmountFloatUpper); | |
var monthTargetAmountLower = Math.round(monthPlannedAmount*monthAmountFloatLower); | |
//组货金额=本单金额+月品类目标已组金额 | |
var monthZhAmount = zhAmount + monthGroupedAmount; | |
if(monthZhAmount < monthTargetAmountLower || monthZhAmount > monthTargetAmountUpper ){ | |
errMsg.push("设计师系列月度组货金额" + monthZhAmount + "不在月目标金额范围【" + monthTargetAmountLower + "-" + monthTargetAmountUpper + "】内!"); | |
}else{ | |
printLog("设计师系列的月末单号组货金额条件满足!"); | |
//ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAmount", "double", monthZhAmount);//月已组货金额 实时表达式计算,无需写入 | |
} | |
} | |
}else{ | |
//4常销款、基本款SKC个数校验,价格带校验 规则表1#和9# | |
var checkTypes = ["R","B"]; | |
//(errMsg,checkTypes,skcsData,ruleTableNode,weekNode,monthNode) | |
checkSKCCountAndPriceList(errMsg,checkTypes,skcsData,ruleTableNode,weekNode,monthNode); | |
//5按照周目标获取组货宽度、组货金额等目标值, 确认是否需要按照款式宽度校验 | |
//5.1.检查主题款look数量和skc数量 | |
var modsObj = skcsData.S.mods; | |
var modList = Object.keys(modsObj); | |
//表1#=SKC标准及LOOK套数的标准值&组货系数 | |
checkSKCLookCount(errMsg,true,modList,modsObj,skcsData,ruleTableNode,weekNode,monthNode); | |
//非最后一单校验单的总金额的95%-105%,单的总宽度的95%-105% | |
if(!isLastWeek){ | |
var targetSkcsUpper = Math.round(targetSkcs*weekSkcsFloatUpper); | |
var targetSkcsLower = Math.round(targetSkcs*weekSkcsFloatLower); | |
var tagetAmountUpper = Math.round(targetAmount*weekAmountFloatUpper); | |
var targetAmountLower = Math.round(targetAmount*weekAmountFloatLower); | |
if(zhSkcs < targetSkcsLower || zhSkcs > targetSkcsUpper ){ | |
errMsg.push("周组货SKC宽度" + zhSkcs + "不在周目标SKC宽度范围【" + targetSkcsLower + "-" + targetSkcsUpper + "】内!"); | |
} | |
if(zhAmount < targetAmountLower || zhAmount > tagetAmountUpper){ | |
errMsg.push("周组货金额" + zhAmount + "不在周目标金额范围【" + targetAmountLower + "-" + tagetAmountUpper + "】内!"); | |
} | |
}else{//循环目标来校验各个品类目标金额、skc宽度、平均单价是否达成 | |
Object.keys(targetTableNode.weekTarget).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var monthTargetDisplay = getMonthTargetKey(monthTargetNode,true,false);//非电商 | |
monthTargetDisplay = "最后一单:"+ monthTargetDisplay; | |
//20240407 月企划/已组金额、企划/已组skc宽度、企划平均单价 | |
var monthGroupedSkcs = monthTargetNode.C8_MCM_MonthGroupGoodsSKCNotLast;//月前三单已组,包含未完成单 | |
var monthGroupedAmount = monthTargetNode.C8_MCM_MonthGroupGoodsAmountNotLast;//月前三单已组,包含未完成单 | |
var monthPlannedSkcs = monthTargetNode.C8_MCM_PlannedSKC; | |
var monthPlannedAmount = monthTargetNode.C8_MCM_PlannedAmount; | |
var monthTargetSkcsUpper = Math.round(monthPlannedSkcs*monthSkcsFloatUpper); | |
var monthTargetSkcsLower = Math.round(monthPlannedSkcs*monthSkcsFloatLower); | |
var monthTargetAmountUpper = Math.round(monthPlannedAmount*monthAmountFloatUpper); | |
var monthTargetAmountLower = Math.round(monthPlannedAmount*monthAmountFloatLower); | |
var monthTargetPriceUpper = Math.round(monthTargetNode.C8_MCM_PlannedAvgPrice*monthAvgPriceFloatUpper); | |
var monthTargetPriceLower = Math.round(monthTargetNode.C8_MCM_PlannedAvgPrice*monthAvgPriceFloatLower); | |
//20240407 最后一单校验品类/中品类月组货skc宽度、金额、平均单价 Agnes | |
var catSkcCount = 0; | |
var finalAmount = 0; | |
var finalQty = 0; | |
if(skcsData.categoryKey[key]) {//&& weekSKCDepthTarget>0 取消判断目标深度 | |
var catKeyNode = skcsData.categoryKey[key]; | |
catSkcCount = catKeyNode.skcs; //组货内skc数量 | |
finalAmount = catKeyNode.finalAmount; //组货金额 | |
finalQty = catKeyNode.finalQty; //组货深度 | |
} | |
//月品类/中品类组货skc宽度=本单品类skc宽度+月品类目标已组skc | |
var monthZhSkcs = catSkcCount + monthGroupedSkcs; | |
if(monthZhSkcs < monthTargetSkcsLower || monthZhSkcs > monthTargetSkcsUpper ){ | |
errMsg.push(monthTargetDisplay + "组货SKC宽度" + monthZhSkcs + "不在月目标SKC宽度范围【" + monthTargetSkcsLower + "-" + monthTargetSkcsUpper + "】内!"); | |
}else{ | |
printLog(monthTargetDisplay + "的月末单号组货宽度条件满足!"); | |
//ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAmount", "double", monthFinishAmount);//月已组货金额 实时表达式计算,无需写入 | |
} | |
//组货金额=本单金额+月品类目标已组金额 | |
var monthZhAmount = finalAmount + monthGroupedAmount; | |
if(monthZhAmount < monthTargetAmountLower || monthZhAmount > monthTargetAmountUpper ){ | |
errMsg.push(monthTargetDisplay + "组货金额" + monthZhAmount + "不在月目标金额范围【" + monthTargetAmountLower + "-" + monthTargetAmountUpper + "】内!"); | |
}else{ | |
printLog(monthTargetDisplay + "的月末单号组货金额条件满足!"); | |
//ac.m_writer.changeNode(monthTargetNode.$URL).changeAttribute("C8_MCM_MonthGroupGoodsAmount", "double", monthZhAmount);//月已组货金额 实时表达式计算,无需写入 | |
} | |
// 组货平均单价=(本单金额+月品类已组金额)/(本单深度+月品类已组深度) | |
if(!key.startsWith("S")){ | |
var monthZhPrice = Math.round(monthZhAmount/(finalQty+monthTargetNode.C8_MCM_MonthGroupGoodsDepthNotLast)); | |
if(monthZhPrice < monthTargetPriceLower || monthZhPrice > monthTargetPriceUpper ){ | |
errMsg.push(monthTargetDisplay + "组货平均单价" + monthZhPrice + "不在月目标平均单价范围【" + monthTargetPriceLower + "-" + monthTargetPriceUpper + "】内!"); | |
} | |
} | |
}); | |
} | |
//5.2按照周目标检核所有品类的组货情况 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
if(!weekTargetNode){ | |
errMsg.push("找不到" + key + "对应目标!"); | |
}else{ | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var monthTargetDisplay = getMonthTargetKey(monthTargetNode,true,false);//非电商 | |
if(isLastWeek){ | |
monthTargetDisplay = "最后一单:"+monthTargetDisplay; | |
} | |
if(skcsData.categoryKey[key]){//&& weekSKCDepthTarget>0 取消判断目标深度 | |
var catKeyNode = skcsData.categoryKey[key]; | |
var catSkcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
var categorySKCList = catKeyNode.list; | |
/* | |
//组货平均价 | |
var weekAvgPriceTargetLower = monthTargetNode.C8_MCM_AvgPriceLow; | |
var weekAvgPriceTargetUpper = monthTargetNode.C8_MCM_AvgPriceHigh; | |
//只检查常销款和基本款, 主题款的校验在上一步执行 | |
if(!key.startsWith("S")){ | |
//平均价校验 | |
if(skcAvgPrice<weekAvgPriceTargetLower || skcAvgPrice>weekAvgPriceTargetUpper){ | |
errMsg.push(monthTargetDisplay+"的组货平均价【"+skcAvgPrice+"】,【不符合】月目标的组货平均价上下限:【"+weekAvgPriceTargetLower+"-"+weekAvgPriceTargetUpper+"】"); | |
} | |
}*/ | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",catSkcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_DAmountFinish","double",finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",finalQty);//组货深度 | |
}else{ | |
if(weekSKCDepthTarget>0){ | |
errMsg.push(monthTargetDisplay+"的组货目标存在,但是没有找到任何对应的实际组货SKC!周组货宽度目标【"+weekSKCDepthTarget+"】"); | |
} | |
} | |
} | |
}); | |
} | |
//Agnes 更新弱管控品类目标 | |
Object.keys(targetTableNode.weakWeekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
var weekSKCUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//周 可超宽度剩余C8_MCMC_ExcessSKCRemaining | |
var weekSKCDepthTarget = weekSKCTarget+weekSKCUpperTarget; | |
if(skcsData.weakCategoryKey[key]&& weekSKCDepthTarget>0) { | |
var catKeyNode = skcsData.weakCategoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish", "double", finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "integer", skcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish", "integer", styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "integer", finalQty);//组货深度 | |
} | |
}); | |
//更新单号组货完成状态 | |
if(errMsg.length==0 || force){ | |
if(!checkOnly){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete");//组货结果状态 | |
//将结果写入SKC上,国内组货深度,组货单号 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
var categorySKCList = catKeyNode.list; | |
categorySKCList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_GNDepth","integer",skcNode.finalQty) | |
.changeAttribute("C8_CW_GNSelected","boolean",true) | |
.changeAttribute("UR_CW_GroupBillNo","ref",weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
// if(orderType == "N"){//计划单 | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
// }else{ | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
// } | |
var urSkcNode = getNode(ac,skcId); | |
if (urSkcNode.UR_Colorway_OKCode == "") { | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode", "UR_Colorway_PLMUniqueValue", true); | |
} | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,urSkcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, true); | |
}); | |
}); | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "组货确认消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已确认";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
} | |
//ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
if(errMsg.length>0){ | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
}else{ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
} | |
var successMsg = ""; | |
if(checkOnly){ | |
successMsg = "数据检核通过!请点击【组货确认】以完成组货!"; | |
}else{ | |
successMsg = "组货确认完成!" | |
flag = true; | |
} | |
jp.alert(successMsg); | |
}else{ | |
if(errMsg.length>0){ | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
}else{ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
} | |
jp.alert("执行校验出现错误,请检查:</BR>"+errMsg.join("</BR>")); | |
} | |
return flag; | |
} | |
// //PLM2 mip001 + mip002接口 | |
// function requestMip001And002(data001,data002,flag){ | |
// var loading = jp.loading("接口请求中"); | |
// requestPlM2ServiceApi('/ur/plm2_mip_001', data001 , false) | |
// .then(function(result) { | |
// jp.close(loading); | |
// if(result){ | |
// jp.alert(result); | |
// }else{ | |
// jp.alert('获取组货结果接口调用成功(plm2_mip_001 )') | |
// requestPlM2ServiceApi('/ur/plm2_mip_002', data002 , false) | |
// .then(function(result) { | |
// jp.close(loading); | |
// if(result){ | |
// jp.alert(result); | |
// }else{ | |
// jp.alert('管控表锁定接口调用成功(plm2_mip_002)'); | |
// } | |
// }) | |
// .catch(function(error) { | |
// jp.alert(error); | |
// jp.close(loading); | |
// }); | |
// } | |
// }) | |
// .catch(function(error) { | |
// jp.alert(error); | |
// jp.close(loading); | |
// }); | |
// } | |
//调用 PLM 后台接口方法 | |
function requestPlM2ServiceApi(url,date,asyncBol){ | |
var requestdate = JSON.stringify(date) | |
// var loading = jp.loading(loadingMessage); | |
return new Promise(function(resolve, reject) { | |
$.ajax({ | |
type: 'post', | |
url: pluginsURL + url, | |
beforeSend: function(request) { | |
request.setRequestHeader("C8_Cookie",getCookie()); | |
}, | |
data:requestdate, | |
async: asyncBol, | |
contentType: 'application/json;charset=utf-8', | |
dataType: 'json', | |
error: function (data) { | |
// jp.close(loading); | |
reject('调用系统后台失败,请联系管理员!'); | |
}, | |
success: function (data) { | |
var dataObj = eval(data); | |
// jp.close(loading); | |
if (dataObj.resultStatus == 0) { | |
resolve(''); | |
//jp.success("处理完成:" + dataObj.msg ); | |
} else { | |
resolve(dataObj.errorMsg); | |
} | |
} | |
}); | |
}); | |
} | |
//电商组货确认 | |
//force=强制确认,checkOnly=是否仅仅检核 | |
function DianShangConfirmZH(ac, force, checkOnly, isDesignerStyle) { | |
var flag = true; | |
var weekURL = ac.m_urlParent; | |
printLog("========电商组货开始执行确认=========="); | |
var weekNode = getNode(ac,weekURL); | |
var isLastWeek = weekNode.UR_ML_IsLastOrder; | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
if(orderType && (orderType==="E" || orderType==="F" || orderType==="T") && !checkOnly){ | |
//如果是应急单,则组货确认时,不做检查,等同于强制确认 | |
force = true; | |
} | |
//定义错误信息 | |
var errMsg = []; | |
//1.获取目标表、规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
var targetTableNode = searchTargetTableDianShang(weekNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
printLog("获取规则表,目标表完成"); | |
//2.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().getChildResultUrls(); | |
//3. 获取计算所需要的数据,封装到JSON中,便于后续校验和计算 | |
var skcsData = getDianShangGroupSKCData(ac,resultURLs,controlRuleKeys,true); | |
var checkPriceAndDeepErrors = skcsData.finalConfirmError; | |
if(!force && checkPriceAndDeepErrors && checkPriceAndDeepErrors.length>0){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",checkPriceAndDeepErrors.join("</BR>")); | |
jp.alert("发现如下错误信息:</BR>"+checkPriceAndDeepErrors.join("</BR>")); | |
return true; | |
} | |
//20240418 新增重置周组货结果 | |
Object.keys(targetTableNode.weekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",0)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",0)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",0)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",0)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",0);//组货深度 | |
}); | |
Object.keys(targetTableNode.weakWeekKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",0)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",0)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",0)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",0)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",0);//组货深度 | |
}); | |
//4. 校验 | |
//4.1校验开始 | |
//Agnes 20240410 设计师系列前三单不卡控,月末单控制总金额 | |
if(isDesignerStyle){ | |
if(isLastWeek){ | |
var targetAmountLower = targetTableNode.targetAmountLower; | |
var targetAmountUpper = targetTableNode.targetAmountUpper; | |
var preZhAmount = targetTableNode.zhAmount; | |
var totalZhAmount = skcsData.amount + preZhAmount; | |
if(totalZhAmount < targetAmountLower || totalZhAmount > targetAmountUpper){ | |
errMsg.push("设计师系列月组货金额不在月组货金额范围【" + targetAmountLower + "-" + targetAmountUpper +"】内" ); | |
}else{ | |
printLog("设计师系列月末单符合金额校验"); | |
} | |
} | |
//更新目标 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
var midCatName = ""; | |
if(key.length>3){ | |
midCatName = locale.getEnumName("UR_enum_ProductMiddleType:"+key.substring(3,5)); | |
} | |
var level = ""; | |
if(key.length>5){ | |
level = key.substring(key.length-1, key.length); | |
} | |
if(!weekTargetNode){ | |
errMsg.push("【"+locale.getEnumName("UR_enum_CommodityType:"+key.substring(0,1))+"】【"+locale.getEnumName("UR_enum_ProductLargeType:"+key.substring(1,3))+"】【"+midCatName+"】【"+level+"】的目标找不到!"); | |
return; | |
} | |
if(skcsData.categoryKey[key] ){//&& weekSKCDepthTarget>0 目标为0时也写入电商组货到colorway | |
var catKeyNode = skcsData.categoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",skcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",finalQty);//组货深度 | |
//.changeAttribute("C8_MCMC_DAmountFinish","double",totalExceedAmountDStyle)//D款大片款超出金额 ??如何计算? | |
} | |
}); | |
}else{ | |
//Agnes 20240409 新增1. 单非N级别的SKC数量/单SKC总数>=规则表(单号组货SKC数合理范围配置表)单号SKC数合理范围下限 | |
//本单组货SKC数量 | |
var zhSkcs = skcsData.skcIds.length; | |
//本单组货非N级别SKC数量 | |
var nonNSkcs = skcsData.nonNSkcs; | |
var nonNRatio = zhSkcs==0 ? 0 : nonNSkcs/zhSkcs; //非N级别SKC占比 | |
var commodityType = skcsData.commodityType;//一个组货月只有一种商品层 | |
//获取单号组货SKC数合理范围配置表中品类中品类为空的,通过月份、商品层、订单属性、风格过滤的配置项 | |
var ruleTableA = filterRuleTable(ruleTableNode,"A",true,{UR_SDS_GroupOrderAattribute:monthNode.C8_MC_MonthOrderAattribute,UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_ProductStyle:monthNode.C8_MC_Style,UR_SDS_CommodityType:commodityType,UR_SDS_ProductLargeType:"UR_enum_ProductLargeType:",UR_SDS_MiddleCategoryType:"UR_enum_ProductMiddleType:"}); | |
if(ruleTableA && ruleTableA.$URL && ruleTableA.$URL != ""){ | |
var weekFloorLimit = ruleTableA.UR_SDS_OrderSKCPercentLow; | |
if(nonNRatio < weekFloorLimit){ | |
errMsg.push("单号组货SKC数小于合理范围" + weekFloorLimit); | |
} | |
}else{ | |
errMsg.push("找不到单组货SKC总数合理范围配置信息,请补充配置项【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(monthNode.C8_MC_Month)+"】【" +locale.getEnumName(monthNode.C8_MC_MonthOrderAattribute)+"】【" + locale.getEnumName(monthNode.C8_MC_Style)+"】的单号SKC数合理范围下限!" ); | |
} | |
//20240409 Agnes 新增2.月末单品类/中品类级别的月非N级别SKC数量/月SKC数量>=规则表中月末单品类级别下限 | |
if(isLastWeek){ | |
Object.keys(skcsData.catCrossLevelKey).forEach(function(key){ | |
var lastWeekCatNonNSkcs = skcsData.catCrossLevelKey[key].catNonNSkcs; //末单组货品类跨等级非N级别SKC数 | |
var lastWeekCatSkcs = skcsData.catCrossLevelKey[key].catSkcs;//月末单组货品类跨等级总skc数 | |
if(targetTableNode.monthSum[key]){ | |
var monthZhSkcs = targetTableNode.monthSum[key].monthZHSkcs;//月品类中品类子品类已组SKC | |
var monthCatNSkcs = targetTableNode.monthSum[key].monthCatNSkcs;//月品类N级已组SKC | |
var monthCatNonNSkcs = monthZhSkcs - monthCatNSkcs;//非N为月品类已组减去月品类N级已组 | |
var tableA = filterRuleTable(ruleTableNode,"A",true,{UR_SDS_GroupOrderAattribute:monthNode.C8_MC_MonthOrderAattribute,UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_ProductStyle:monthNode.C8_MC_Style,UR_SDS_CommodityType:commodityType,UR_SDS_ProductLargeType:"UR_enum_ProductLargeType:",UR_SDS_MiddleCategoryType:"UR_enum_ProductMiddleType:"}); | |
var midCatName = ""; | |
if(key.length>3){ | |
midCatName = locale.getEnumName("UR_enum_ProductMiddleType:"+key.substring(3,5)); | |
} | |
if(tableA && tableA.$URL && tableA.$URL != ""){ | |
var monthFloorLimit = tableA.UR_SDS_SKCPercentLow; | |
var monthCatNonNRatio = (lastWeekCatSkcs+monthZhSkcs)== 0 ? 0 : (lastWeekCatNonNSkcs+monthCatNonNSkcs)/(lastWeekCatSkcs+monthZhSkcs); | |
if(monthCatNonNRatio < monthFloorLimit){ | |
errMsg.push("【"+locale.getEnumName(commodityType)+"】【" + locale.getEnumName("UR_enum_ProductLargeType:"+key.substring(1,3))+"】【" + midCatName +"】月组货SKC数小于合理范围" + monthFloorLimit); | |
} | |
}else{ | |
errMsg.push("找不到月份SKC数合理范围下限配置信息,请补充配置项【"+locale.getEnumName(commodityType)+"】【"+locale.getEnumName(monthNode.C8_MC_Month)+"】【" +locale.getEnumName(monthNode.C8_MC_MonthOrderAattribute)+"】【" + locale.getEnumName(monthNode.C8_MC_Style)+"】【" + locale.getEnumName("UR_enum_ProductLargeType:"+key.substring(1,3))+"】【" + midCatName+"】的月份SKC数合理范围下限!" ); | |
} | |
}else{ | |
errMsg.push("找不到【"+locale.getEnumName(commodityType)+"】【" + locale.getEnumName("UR_enum_ProductLargeType:"+key.substring(1,3))+"】【" + midCatName+"】的目标!" ); | |
} | |
}); | |
} | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
var midCatName = ""; | |
if(key.length>3){ | |
midCatName = locale.getEnumName("UR_enum_ProductMiddleType:"+key.substring(3,5)); | |
} | |
var level = ""; | |
if(key.length>5){ | |
level = key.substring(key.length-1, key.length); | |
} | |
if(!weekTargetNode){ | |
errMsg.push("【"+locale.getEnumName("UR_enum_CommodityType:"+key.substring(0,1))+"】【"+locale.getEnumName("UR_enum_ProductLargeType:"+key.substring(1,3))+"】【"+midCatName+"】【"+level+"】的目标找不到!"); | |
return; | |
} | |
var monthTargetNode = weekTargetNode.monthTarget; | |
var monthTargetDisplay = getMonthTargetKey(monthTargetNode,true,true);//电商key | |
//组货宽度 | |
var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
var weekSKCUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//周 可超宽度剩余 | |
var weekSKCDepthTarget = weekSKCTarget+weekSKCUpperTarget; | |
if(skcsData.categoryKey[key] ){//&& weekSKCDepthTarget>0 目标为0时也写入电商组货到colorway | |
var catKeyNode = skcsData.categoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//组货金额 | |
var monthCanOverseedAmout = monthTargetNode.C8_MCM_ExcessAmount; //月可超金额 | |
var weekAmount = weekTargetNode.C8_MCMC_GroupGoodsAmount; //周目标组货金额 | |
var monthPlanAmount = monthTargetNode.C8_MCM_PlannedAmount;//月企划金额 | |
var monthPlanSkc = monthTargetNode.C8_MCM_PlannedSKC;//月企划SKC | |
//var monthCanOverSkc = monthTargetNode.C8_MCM_PlannedSKC //月可超SKC | |
var monthCanDeduceAmount = monthTargetNode.C8_MCM_ReduceAmount; //月可减金额 | |
var monthFinishAmount = monthTargetNode.C8_MCM_MonthGroupGoodsAmount;//月已组货金额 | |
//组货金额上限= 月企划总金额+月可超金额-月已组货金额 | |
var weekFinalCheckAmountUpper = monthPlanAmount+monthCanOverseedAmout-monthFinishAmount; | |
//组货金额下限=月企划总金额-月可减金额-月已组货金额 | |
var weekFinalCheckAmountLower = monthPlanAmount-monthCanDeduceAmount-monthFinishAmount; | |
//组货平均价 | |
// var weekAvgPriceTargetLower = monthTargetNode.C8_MCM_AvgPriceLow; | |
// var weekAvgPriceTargetUpper = monthTargetNode.C8_MCM_AvgPriceHigh; | |
//校验宽度 | |
if(skcCount>monthPlanSkc*1.05){ | |
errMsg.push(monthTargetDisplay+"的实际组货深度为【"+skcCount+"】,【大于】月目标的组货宽度加可超宽度剩余总和:【"+weekSKCDepthTarget+"】"); | |
} | |
//最后一单 | |
if(isLastWeek){ | |
//校验金额 | |
if(finalAmount>weekFinalCheckAmountUpper || finalAmount<weekFinalCheckAmountLower){ | |
errMsg.push("月最后一单:"+monthTargetDisplay+"的实际组货金额为【"+finalAmount+"】,【不符合】月组货金额目标的可减后总金额【"+weekFinalCheckAmountLower+"】和月可超总金额:【"+weekFinalCheckAmountUpper+"】的区间要求"); | |
} | |
}/* 取消前三单的金额滚动校验 | |
else{ | |
//校验金额 | |
if(finalAmount>weekFinalCheckAmountUpper){ | |
errMsg.push("非最后一单:"+monthTargetDisplay+"的实际组货金额为【"+finalAmount+"】,【超出】月组货金额目标加可超金额总和:【"+weekFinalCheckAmountUpper+"】的要求"); | |
} | |
}*/ | |
/* 改到确认通过时写入 | |
//将结果写入SKC上,电商组货深度 | |
catKeyNode.list.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_DSDepth","integer",skcNode.finalQty); | |
}); | |
*/ | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
//将结果写入到周目标上 -- 临时,后续需要改为从调整深度上汇总并写入到目标上, | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",skcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish","integer",styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",finalQty);//组货深度 | |
//.changeAttribute("C8_MCMC_DAmountFinish","double",totalExceedAmountDStyle)//D款大片款超出金额 ??如何计算? | |
}else{ | |
if(weekSKCDepthTarget>0){ | |
errMsg.push(monthTargetDisplay+"的组货目标存在,但是没有找到任何对应的实际组货SKC!周组货宽度目标【"+weekSKCDepthTarget+"】"); | |
} | |
} | |
}); | |
} | |
//Agnes 更新弱管控品类目标 | |
Object.keys(skcsData.weakCategoryKey).forEach(function(key){ | |
var weekTargetNode = targetTableNode.weakWeekTarget[key]; | |
//var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
//var weekSKCUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//周 可超宽度剩余C8_MCMC_ExcessSKCRemaining | |
//var weekSKCDepthTarget = weekSKCTarget+weekSKCUpperTarget; | |
if(weekTargetNode) { | |
var catKeyNode = skcsData.weakCategoryKey[key]; | |
var skcCount = catKeyNode.skcs; //组货内skc数量 | |
var styleCount = catKeyNode.styles; //组货内款式数量 | |
var finalQty = catKeyNode.finalQty; //组货深度 | |
var finalDStyleAmout = catKeyNode.finalDStyleAmout; | |
var finalAmount = catKeyNode.finalAmount; //组货金额 | |
var skcAvgPrice = catKeyNode.AvgPrice; //组货平均价 | |
//写入实际组货金额、宽度、平均价等信息 | |
var weekTargetURL = weekTargetNode.$URL; | |
ac.m_writer.changeNode(weekTargetURL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", finalAmount)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish", "double", finalDStyleAmout)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "integer", skcCount)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", skcAvgPrice)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish", "integer", styleCount)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "integer", finalQty);//组货深度 | |
} | |
}); | |
printLog("=========检核计算结果完成===="); | |
//更新单号组货完成状态 | |
if(errMsg.length==0 || force){ | |
if(!checkOnly){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Complete");//组货结果状态 | |
//将结果写入SKC上,电商组货深度 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
categorySKCList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId).changeAttribute("C8_CW_DSDepth", "integer", skcNode.finalQty); | |
}); | |
}); | |
//将结果写入SKC上,电商组货深度,组货单号 0520新增 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var catKeyNode = skcsData.categoryKey[key]; | |
var categorySKCList = catKeyNode.list; | |
var categorySKCList = catKeyNode.list; | |
categorySKCList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
ac.m_writer.changeNode(skcId) | |
//.changeAttribute("C8_CW_DSDepth","integer",skcNode.finalQty) | |
.changeAttribute("C8_CW_DSPick","boolean",true) | |
.changeAttribute("UR_CW_GroupBillNo","ref",weekURL); | |
//更新SKC上的确认唯一码UR_Colorway_OKCode:如果是计划单用UR_Colorway_PLMUniqueValue,否则用UR_Colorway_OriginalUniqueCode | |
// if(orderType == "N"){//计划单 | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_PLMUniqueValue",true); | |
// }else{ | |
// ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode","UR_Colorway_OriginalUniqueCode",true); | |
// } | |
//0521 不分渠道 都取UR_Colorway_PLMUniqueValue | |
var urSkcNode = getNode(ac,skcId); | |
if (urSkcNode.UR_Colorway_OKCode == "") { | |
ac.m_writer.changeNode(skcId).changeAttributeExp("UR_Colorway_OKCode", "UR_Colorway_PLMUniqueValue", true); | |
} | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,urSkcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, true); | |
}); | |
}); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
if(errMsg.length>0){ | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
flag = false; | |
}else{ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
} | |
jp.success("操作完成!"); | |
}else{ | |
if(errMsg.length>0){ | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
jp.alert("执行校验出现错误,请检查:</BR>"+errMsg.join("</BR>")); | |
flag = false; | |
}else{ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
} | |
} | |
return flag; | |
} | |
/** | |
* 查找 年份季节+品牌+系列+风格+组货单号+【组】订单属性 形同的单号 是否正在发送组货数据给其他系统 | |
* @param ac | |
* @param weekURL 单号url | |
* @returns {string} 报错信息,如果无报错,返回“” | |
*/ | |
function checkSameMLIsZHing(ac,weekURL){ | |
debugger | |
//查询当前组货单号的所有渠道的MarketingLook,如果有渠道正在发送中,则提示稍后操作 | |
const weekNode = getNode(ac, weekURL); | |
var mcNode = getNode(ac,weekNode.__Parent__); | |
var searchDoing = new Search(); | |
var mcLockIngQuery = searchDoing.getQuery(); | |
mcLockIngQuery.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MarketingLook") | |
.Attr("C8_MC_Series", xml.OP_EQUALS, mcNode.C8_MC_Series, "Child:__Parent__") | |
.Attr("C8_MC_Style", xml.OP_EQUALS, mcNode.C8_MC_Style, "Child:__Parent__") | |
.Attr("C8_MC_Brand", xml.OP_EQUALS, mcNode.C8_MC_Brand, "Child:__Parent__") | |
.Attr("C8_MC_Month", xml.OP_EQUALS, mcNode.C8_MC_Month, "Child:__Parent__") | |
.Attr("C8_MC_MonthOrderAattribute", xml.OP_EQUALS, mcNode.C8_MC_MonthOrderAattribute, "Child:__Parent__") | |
.Attr("C8_ML_Week", xml.OP_EQUALS,weekNode.C8_ML_Week); | |
var res = searchDoing.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if(results){ | |
for (item of results) { | |
//如果有渠道正在发送中,则提示稍后操作 | |
if (item.UR_ML_Send_Ready_Flag) { | |
const sendMmcNode = getNode(ac, item.__Parent__); | |
return sendMmcNode['Node Name'] + ' 正在发送组货数据,请等待2分钟后再次操作'; | |
} | |
} | |
} | |
return ''; | |
} | |
/** | |
* 电商/海外/国内 【组货确认】/【强制确认】 校验必填信息 | |
* | |
* @param ac | |
* @param type 1 国内组货 2 电商组后 3 海外组货 | |
* @returns 报错信息 | |
*/ | |
function checkRequiredToConfirm(ac, type) { | |
const weekURL = ac.m_urlParent; | |
const weekNode = getNode(ac, weekURL); | |
const resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().store._allResultUrls; | |
let sameMeg = checkSameMLIsZHing(ac, weekURL);//查找是否有其他渠道正在组货中 | |
if (sameMeg) { | |
return sameMeg; | |
} | |
const resultErrorMsg = []; | |
if (resultURLs && resultURLs.length > 0) { | |
const amount = 0; | |
resultURLs.forEach(function (url) { | |
const nodeObj = getNode(ac, url); | |
if (nodeObj && nodeObj.$Type == "MCProduct") { | |
var errorMsg = ""; | |
if (!nodeObj.C8_MCP_SKC || nodeObj.C8_MCP_SKC == "centric:") { | |
errorMsg = "导入唯一键:" + nodeObj.C8_MCP_ID + " 缺少【配色】" + "</BR>"; | |
} else { | |
const skcObj = getNode(ac, nodeObj.C8_MCP_SKC); | |
const plmUniqueValue = skcObj.UR_Colorway_PLMUniqueValue; | |
var errorMsgItem=''; | |
if (!skcObj.UR_Colorway_BaseColor || skcObj.UR_Colorway_BaseColor == "centric:") { | |
errorMsgItem = errorMsgItem + "【基础颜色】"; | |
} | |
if (!skcObj.CodeN || skcObj.CodeN == "") { | |
errorMsgItem = errorMsgItem + "【新配色号】"; | |
} | |
if (!skcObj['Node Name'] || skcObj['Node Name'] == "") { | |
errorMsgItem = errorMsgItem + "【配色名】"; | |
} | |
if (!skcObj.C8_CW_Special || skcObj.C8_CW_Special == "UR_enum_Special:") { | |
errorMsgItem = errorMsgItem + "【[组]】特殊款】"; | |
} | |
const styleNode = getNode(ac, skcObj.__Parent__); | |
if (!styleNode.UR_Style_ModuleNumber || styleNode.UR_Style_ModuleNumber == "centric:") { | |
errorMsgItem = errorMsgItem + "【模块号】"; | |
} | |
var styleAttr = getNode(ac,styleNode.Attributes); | |
if (!styleAttr.UR_StyleAttributes_BasicUnit || styleAttr.UR_StyleAttributes_BasicUnit == "UR_enum_Unit:") { | |
errorMsgItem = errorMsgItem + "【基本单位】"; | |
} | |
if (errorMsgItem) { | |
errorMsg = errorMsg + 'PLM唯一值 ' + plmUniqueValue + ' ' + errorMsgItem + "为空,请检查" + "</BR>"; | |
} | |
const dsAdjustingDepth = nodeObj.C8_MCP_AdjustingDepth; | |
const hwAdjustingDepth = nodeObj.C8_MCP_AdjustingDepthHy; | |
const gnAdjustingDepth = nodeObj.C8_MCP_AdjustingDepth; | |
const dsDepth = skcObj.C8_CW_DSDepth; | |
const hwDepth = skcObj.C8_CW_HWDepth; | |
const gnDepth = skcObj.C8_CW_GNDepth; | |
if (type === 1) { // 国内组货 | |
if (dsDepth === 0 && hwDepth === 0 && (!gnAdjustingDepth || gnAdjustingDepth === 0)) { | |
errorMsg = errorMsg + plmUniqueValue + " 国内/电商/海外三个渠道的组货深度均为0,请检查" + "</BR>"; | |
} | |
} else if (type === 2) { // 电商组货 | |
if (gnDepth === 0 && hwDepth === 0 && (!dsAdjustingDepth || dsAdjustingDepth === 0)) { | |
errorMsg = errorMsg + plmUniqueValue + " 国内/电商/海外三个渠道的组货深度均为0,请检查" + "</BR>"; | |
} | |
} else if (type === 3) { // 海外组货 | |
debugger | |
if (dsDepth === 0 && gnDepth === 0 && (!hwAdjustingDepth || Object.keys(hwAdjustingDepth).length > 0)) { | |
var isAll0 = true; | |
var storeVolumnMap = new Map(Object.entries(hwAdjustingDepth)); | |
for (const [key, value] of storeVolumnMap) { | |
if (value !== 0) { | |
isAll0 = false; | |
} | |
} | |
if (isAll0) { | |
errorMsg = errorMsg + plmUniqueValue + " 国内/电商/海外三个渠道的组货深度均为0,请检查" + "</BR>"; | |
} | |
} | |
//海外款校验特殊款必填 Jarvis 20240601 | |
if(skcObj.C8_CW_Special == "UR_enum_Special:"){ | |
errorMsg = errorMsg + "设计号为:" + styleNode.Code + "的[组]特殊款必填,请检查" + "</BR>"; | |
} | |
} | |
} | |
if (errorMsg) { | |
resultErrorMsg.push(errorMsg + "</BR>"); | |
} | |
} | |
}); | |
} | |
return resultErrorMsg.join("</BR>").substring(0, 1000); | |
} | |
return { | |
// 2) Functions referenced from Site.xml | |
OnCreateGuoNeiRule:function(ac){ | |
var newURL = ac.m_urlNode; | |
var fromURL = ac.m_nodeSource.$URL; | |
ac.m_writer.reset(); | |
ac.m_writer.copyNode(newURL,fromURL); | |
ac.m_writer.changeNode(newURL).changeAttribute("__Parent__","ref","centric://REFLECTION/INSTANCE/_CS_Data/null"); | |
setRuleTemple(ac,newURL); | |
}, | |
OnCreateHaiWaiRule:function(ac){ | |
var newURL = ac.m_urlNode; | |
var fromURL = ac.m_nodeSource.$URL; | |
ac.m_writer.reset(); | |
ac.m_writer.copyNode(newURL,fromURL); | |
ac.m_writer.changeNode(newURL).changeAttribute("__Parent__","ref","centric://REFLECTION/INSTANCE/_CS_Data/null"); | |
setRuleTemple(ac,newURL); | |
}, | |
OnCreateDianShangRule:function(ac){ | |
var newURL = ac.m_urlNode; | |
var fromURL = ac.m_nodeSource.$URL; | |
ac.m_writer.reset(); | |
ac.m_writer.copyNode(newURL,fromURL); | |
ac.m_writer.changeNode(newURL).changeAttribute("__Parent__","ref","centric://REFLECTION/INSTANCE/_CS_Data/null"); | |
setRuleTemple(ac,newURL); | |
}, | |
OnCopyRule:function(ac){ | |
var newURL = ac.m_urlNode; | |
ac.m_writer.changeNode(newURL).changeAttribute("__Parent__","ref","centric://REFLECTION/INSTANCE/_CS_Data/null"); | |
}, | |
//电商、海外组货从Colorway中选款 | |
C8_NewMCPFromColorway:function(ac) { | |
ac.m_writer.reset(); | |
var selectedSkcs = ac.m_formData.getSelectedNodes(); | |
var mlUrl = ac.m_urlParent; | |
var mlNode = ac.m_cache.getNode(mlUrl); | |
var existingSKCs = []; | |
//获取现有MCProduct下的skc | |
var existingMCPs = mlNode.LookProducts; | |
if(existingMCPs && existingMCPs.length>0){ | |
existingMCPs.forEach(function(mcpurl){ | |
var mcProduct = getNode(ac,mcpurl); | |
var skcURL = mcProduct.C8_MCP_SKC; | |
if(skcURL && skcURL!="centric:" && skcURL !=""){ | |
existingSKCs.push(skcURL); | |
} | |
}); | |
} | |
var viewId = ac.widget.defView.m_id; | |
var attName = ""; | |
if(viewId=="MCProducts"){ | |
attName = "C8_CW_GNPick"; | |
}else if(viewId=="C8_MCProductsDS"){ | |
attName = "C8_CW_DSPick"; | |
}else if(viewId=="C8_GroupGoodsGallery" || viewId=="C8_GroupGoodsGalleryOM"){ | |
attName = "C8_CW_HWPick"; | |
} | |
for(var i=0; i<selectedSkcs.length; i++){ | |
//重复的SKC不添加 | |
if(!existingSKCs.includes(selectedSkcs[i].$URL)){ | |
var newUrl = comm.createUrl("MCProduct"); | |
ac.m_writer.createNode(newUrl, "MCProduct") | |
.changeAttribute("C8_MCP_SKC", "ref", selectedSkcs[i].$URL) | |
.changeAttribute("C8_MCP_WeekNum", "ref", mlUrl) | |
.changeAttribute("ProductStyle","ref",selectedSkcs[i].__Parent__) | |
.attach(mlUrl, "LookProducts") | |
.attach(mlNode.PrimaryCollection, "Products"); | |
if(attName !=""){ | |
ac.m_writer.changeNode(selectedSkcs[i].$URL).changeAttribute(attName,"boolean",true); | |
//选入选款池后改成打标签过程中 | |
ac.m_writer.changeNode(mlUrl).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Start"); | |
} | |
} | |
//选中的SKU设置 WESTV平均深度 通过商品层,周C8_MCMC_Week 以及品类 中品类 找到唯一的MCMaterial | |
var styleNode = getNode(ac,selectedSkcs[i].__Parent__); | |
var styleAttrNode = getNode(ac,styleNode.Attributes); | |
var midCat = getEnumValue(styleAttrNode.UR_StyleAttributes_MiddleCategoryTypeCount); | |
if(midCatMapping.has(midCat)){ | |
midCat = midCatMapping.get(midCat); | |
} | |
var mcUrl = mlNode.__Parent__; | |
var search = new Search(); | |
var q = search.getQuery(); | |
//查询当前MC下的第一个商品层、大类、中类与款式相同的月目标 | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterial") | |
.RefAttr("__Parent__", xml.OP_EQUALS, mcUrl) | |
.Attr("C8_MCM_CommodityType", xml.OP_EQUALS, styleNode.UR_Style_CommodityType) | |
.Attr("C8_MCM_ProductLargeType", xml.OP_EQUALS, styleNode.UR_Style_ProductLargeType) | |
.Attr("C8_MCM_CategoryInPlan", xml.OP_EQUALS, styleAttrNode.UR_StyleAttributes_MiddleCategoryType) | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if (results.length > 0) { | |
var mcMaterialNode = results[0]; | |
ac.m_writer.changeNode(styleNode.$URL).changeAttribute("UR_Style_MonthAvgDepth","integer",Math.round(mcMaterialNode.C8_MCM_MonthAvgDepth)); | |
}else{ | |
var search2 = new Search(); | |
var q2 = search2.getQuery(); | |
//查询当前MC下的第一个商品层、大类与款式相同的月目标 | |
q2.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterial") | |
.RefAttr("__Parent__", xml.OP_EQUALS, mcUrl) | |
.Attr("C8_MCM_CommodityType", xml.OP_EQUALS, styleNode.UR_Style_CommodityType) | |
.Attr("C8_MCM_ProductLargeType", xml.OP_EQUALS, styleNode.UR_Style_ProductLargeType); | |
res = search2.execute({sync: true}); | |
results = res.getResultNodes(); | |
if(results.length > 0){ | |
var mcMaterialNode = results[0]; | |
ac.m_writer.changeNode(styleNode.$URL).changeAttribute("UR_Style_MonthAvgDepth","integer",Math.round(mcMaterialNode.C8_MCM_MonthAvgDepth)); | |
}else{ | |
ac.m_writer.changeNode(styleNode.$URL).changeAttribute("UR_Style_MonthAvgDepth","integer",0); | |
} | |
} | |
} | |
return true; | |
}, | |
CreateSpecItemOnAction:function(ac) { | |
var specItemUrl = ac.m_urlNode; | |
var viewId = ac.widget.defView.m_id; | |
var viewIndex = ""; | |
if(viewId && viewId.length>0){ | |
viewIndex = viewId.substring(viewId.length-1); | |
} | |
if(viewIndex && viewIndex !=""){ | |
ac.m_writer.changeNode(specItemUrl).changeAttribute("UR_SDS_TableRule","enum","UR_Rule:"+viewIndex); | |
} | |
return true; | |
}, | |
//创建单号时,设置单号的parent为MarketingCollection,以建立层级关系 | |
CreateMarketingLookOnAction:function(ac) { | |
var looURL = ac.m_urlNode; | |
if(looURL && looURL !="centric:"){ | |
ac.m_writer.changeNode(looURL).changeAttributeExp("__Parent__","PrimaryCollection",true); | |
} | |
return true; | |
}, | |
//国内选款 | |
C8_SelectSKC:function(ac) { | |
var urls = wrapCnls(ac); | |
invokeJavaActionCurrentUser("", "c8function/selectSKC", {urls: urls}); | |
return true; | |
}, | |
//款式复制 Jarvis 20231127 | |
C8_CopyStyle:function(ac){ | |
var node = getNode(ac,ac.m_urlNode); | |
var newurl = copyStyleFormOldStyle(ac,node); | |
jp.alert("产品复制成功"); | |
return true; | |
}, | |
//款式复制 Jarvis 20231127 | |
C8_GJCopyStyle:function(ac){ | |
var node = getNode(ac,ac.m_urlNode); | |
//移动层级 | |
var colNode = getNode(ac,node.Collection); | |
var cate2Node = getNode(ac,node.Category2); | |
var cate1Node = getNode(ac,node.Category1); | |
var lookItemNode = ""; | |
//根据风格配置表转换风格 Jarvis 20240520 | |
if(cate1Node.UR_Brand_ProductSeriation != "UR_enum_ProductSeriation:I") { | |
var searchl = new Search(); | |
var queryl = searchl.getQuery(); | |
queryl.Node(xml.PROP_TYPE, xml.OP_EQUALS, "LookupItem") | |
.Attr("C8_LI_YSeries", xml.OP_EQUALS, cate1Node.UR_Brand_ProductSeriation) | |
.Attr("C8_LI_CStyle", xml.OP_EQUALS, node.UR_Style_ProductStyle) | |
.Attr("Node Name", xml.OP_EQUALS, "风格转换配置表", "Child:Subtype"); | |
var resl = searchl.execute({ | |
sync: true | |
}); | |
var resultsl = resl.getResultNodes(); | |
if(resultsl.length > 0){ | |
lookItemNode = resultsl[0]; | |
}else{ | |
jp.alert("风格转换配置表还未维护,请先维护风格转换配置表!"); | |
return true; | |
} | |
} | |
var newurl = copyStyleFormOldStyle(ac,node); | |
ac.m_writer.changeNode(newurl).changeAttribute("C8_Style_OldCode","ref",node.$URL); | |
ac.m_writer.changeNode(newurl).changeAttribute("UR_Style_StyleSource","string","转版"); | |
ac.m_writer.changeNode(node.$URL).changeAttribute("UR_Style_StyleSource","string","转版"); | |
if(cate1Node.UR_Brand_ProductSeriation == "UR_enum_ProductSeriation:I"){ | |
ac.m_writer.changeNode(newurl).changeAttribute("C8_Style_Translation","enum","UR_enum_Translation:02"); | |
}else{ | |
ac.m_writer.changeNode(newurl).changeAttribute("C8_Style_Translation","enum","UR_enum_Translation:01"); | |
} | |
var search = new Search(); | |
var query = search.getQuery(); | |
query.Node(xml.PROP_TYPE, xml.OP_EQUALS, "Collection") | |
.Attr("UR_Collection_ProductLargeType",xml.OP_EQUALS,colNode.UR_Collection_ProductLargeType) | |
.Attr("UR_Department_Month",xml.OP_EQUALS,cate2Node.UR_Department_Month,"Child:__Parent__") | |
.Attr("UR_Brand_Brand",xml.OP_EQUALS,"UR_enum_Brand:01","Child:__Parent__/Child:__Parent__") | |
.Attr("UR_Brand_ProductSeriation",xml.OP_EQUALS,"UR_enum_ProductSeriation:I","Child:__Parent__/Child:__Parent__") | |
.RefAttr("ParentSeason", xml.OP_EQUALS, node.ParentSeason); | |
var res = search.execute({ | |
sync: true | |
}); | |
var results = res.getResultNodes(); | |
if (results.length > 0) { | |
ac.m_writer.callMethod("Apparel", "MoveTo") | |
.addParameter("AddURL", xml.ATTR_REF, results[0].$URL) | |
.addParameter("URL", xml.ATTR_REF, newurl) | |
.addParameter("ParentURL", xml.ATTR_REF, colNode.$URL) | |
.addParameter("Toggle", "boolean", true); | |
if(lookItemNode != ""){ | |
ac.m_writer.changeNode(newurl).changeAttribute("UR_Style_ProductStyle","enum",lookItemNode.C8_LI_IStyle); | |
} | |
//固定,无论I转C还是C转I 都是I系列 | |
ac.m_writer.changeNode(newurl+ "?Path=Child:Attributes").changeAttribute("UR_StyleAttributes_ProductSeriation","enum","UR_enum_ProductSeriation:I"); | |
ac.m_writer.changeNode(newurl).changeAttributeExp("Code","block(\n" + | |
" if((enumValue(ParentSeason.UR_Season_Year)==\"2021\"&&enumValue(ParentSeason.UR_Season_Season)==\"F\")||enumValue(ParentSeason.UR_Season_Year)> \"2021\",( \n" + | |
"seqName=rightstr(enumValue(ParentSeason.UR_Season_Year),2) \n" + | |
"+enumValue(ParentSeason.UR_Season_Season) \n" + | |
"+enumValue(UR_Style_ProductStyle)\n" + | |
"+enumValue(UR_Style_ProductLargeType)),\n" + | |
"(seqName=rightstr(enumValue(ParentSeason.UR_Season_Year),2) \n" + | |
"+enumValue(ParentSeason.UR_Season_Season)\n" + | |
"+enumValue (__Parent__.__Parent__.__Parent__.UR_Brand_ProductSeriation)\n" + | |
"+ enumValue(UR_Style_ProductLargeType))) ,\n" + | |
" seq=format(\"{0,number,0000}\",uniqueKey(seqName)),\n" + | |
" if((enumValue(ParentSeason.UR_Season_Year)==\"2024\"&&enumValue(ParentSeason.UR_Season_Season)==\"F\") && integer(seq) < 500, seq = integer(seq) +500,seq),\n" + | |
" string(seq),\n" + | |
" seq = if(seq.length() < 4 ,\"0\"+string(seq),if(seq.length() < 3 ,\"00\"+string(seq),seq)),\n" + | |
" seqName+seq\n" + | |
")",true); | |
ac.m_writer.changeNode(newurl).changeAttributeExp("Node Name","Code",true); | |
//取消选款确认 20240531 Jarvis | |
var newStyleNode = getNode(ac,newurl); | |
var colorways = newStyleNode.ActiveColorways; | |
for(var i =0;i<colorways.length;i++){ | |
ac.m_writer.changeNode(colorways[i]).changeAttribute("Active","boolean","false"); | |
} | |
} | |
jp.alert("国际转版成功!"); | |
return true; | |
}, | |
//国内组货计算 | |
C8_GuoNeiCalculate:function(ac) { | |
var startTime = new Date(); | |
var currentNode = routerStore.locationNode; | |
var loadingMessage = "正在执行组货计算,请耐心等待................"; | |
var delim = "</BR>"; | |
var loading = jp.loading(loadingMessage); | |
var processingTime = "总执行时间:"; | |
var stepInfo = ""; | |
var weekURL = ac.m_urlParent; | |
printLog("========开始执行时间:"+startTime); | |
var weekNode = getNode(ac,weekURL); | |
var isLastWeek = weekNode.UR_ML_IsLastOrder; | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
//1.获取组货规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
//2.获取目标表 | |
var targetTableNode = searchTargetTable(weekNode); | |
printLog("获取规则表,目标表完成"); | |
//3.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().store._allResultUrls; | |
//4. 获取计算所需要的数据,封装到JSON中,便于后续校验和计算 | |
var beginTime = new Date(); | |
//loading = jp.loading(loadingMessage+delim+"获取计算skc数据表所需要的数据信息[开始]"); | |
var skcsData = getAndGroupSKCDataV2(ac,resultURLs, controlRuleKeys); | |
var allData = {month:monthNode,week:weekNode,target:targetTableNode,rules:ruleTableNode,data:skcsData}; | |
//loading = jp.loading(loadingMessage+delim+"获取计算skc数据表所需要的数据信息[结束] 耗时:"+timeDiff(beginTime,new Date())); | |
printLog("获取SKC和计算数据完成"); | |
//错误信息声明 | |
var errMsg = []; | |
var checkErrors = skcsData.errors; | |
if(checkErrors && checkErrors.length>0){ | |
errMsg.push(checkErrors.join("</BR>")); | |
} | |
//20240408 Agnes 获取规则表7的周组货金额上下限 | |
var weekAmountFloatUpper = 1; | |
var weekAmountFloatLower = 1; | |
//获取规则表7:组货金额、宽度、平均单价上下限检核条件 | |
var ruleTable7 = filterRuleTable(ruleTableNode, "7", false, null); | |
ruleTable7.forEach(function(ruleNode){ | |
if(ruleNode.UR_SDS_Dimension == "UR_enum_Dimension:组货金额"){ | |
weekAmountFloatUpper = ruleNode.UR_SDS_BillUpperRate; | |
weekAmountFloatLower = ruleNode.UR_SDS_BillLowerRate; | |
return; | |
} | |
}); | |
//===================现获取对应的最低深度,然后再进行校验=================== | |
//5. 计算最低深度 - 后续look的校验需要根据最低深度校验,所以需要先获取最低深度,用于初始深度计算 | |
//5.1 主题款最低深度计算 | |
//5.1.1 渠道款最低深度计算 | |
var channelSKCs = skcsData.S.channelSKC; | |
channelSKCs.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
var skcInitQty = skcNode.initQty; | |
var skcMinQty = skcNode.minQty; | |
var price = skcNode.price; | |
//表5#=SKC标准及LOOK套数的标准值&组货系数 | |
//表6#=南北款店铺数 | |
var tableRuleT5 = filterRuleTable(ruleTableNode,"5",true,{UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_ProductStyle:monthNode.C8_MC_Style,UR_SDS_ProductLargeType:skcNode.catId}); | |
var tableRuleT6 = filterRuleTable(ruleTableNode,"6",true,{UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_DesignatedChannels:skcNode.channelType}); | |
if((tableRuleT5 && tableRuleT5.$URL && tableRuleT5.$URL!="") && (tableRuleT6 && tableRuleT6.$URL && tableRuleT6.$URL!="")){ | |
var deep = tableRuleT5.UR_SDS_LowDepth; | |
var shopCount = tableRuleT6.UR_SDS_StoresNumber; | |
var ruleQty = deep*shopCount; | |
printLog("\t渠道款获取最低深度:【"+skcId+"】ruleQty="+ruleQty+" skcMinQty="+skcMinQty); | |
if(skcMinQty<ruleQty){ | |
skcMinQty = ruleQty; | |
} | |
if(skcInitQty<skcMinQty){ | |
skcInitQty = skcMinQty; | |
} | |
}else{ | |
printLog("skc="+skcId+"没有找到对应规则表5和表6的组货系数与南北宽店铺数信息!"); | |
} | |
//记录最低深度和初始深度 | |
skcsData.list[skcId].minQty = skcMinQty;//取最小值存入当前skc数据中 | |
skcsData.list[skcId].initQty = skcInitQty;//计入初始值中 | |
skcsData.list[skcId].initAmount = price*skcInitQty; //计算初始金额 | |
}); | |
//5.1.2 特殊款最低深度计算 - 特殊款、D款、大片款,包含了常销款基本款的D款和大片款计算 | |
var minDeppRul3SKCs = skcsData.minDeepRule3; | |
//按月按风格 | |
//表3#=月份&风格特殊款最低深度 | |
var tableRuleT3 = filterRuleTable(ruleTableNode,"3",false,{UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_ProductStyle:monthNode.C8_MC_Style}); | |
minDeppRul3SKCs.forEach(function(skcId){ | |
//lookName:lookName,displayName:displayName,specialTypeName:specialTypeName,channelTypeName:channelTypeName, | |
var skcNode = skcsData.list[skcId]; | |
var skcInitQty = skcNode.initQty; | |
var skcMinQty = skcNode.minQty; | |
var isDStyle = skcNode.isDStyle; | |
var specialType = skcNode.specialType; | |
var isSpecialStyle = skcNode.isSpecialStyle; | |
var isLook = skcNode.isLook; | |
var price = skcNode.price; | |
//根据skc属性值,过去对应获取最大值的条件范围 | |
var filterGroup = []; | |
//获取特殊款最低深度值,用于组货计算 | |
if(isSpecialStyle && !isDStyle){ | |
//非D款和大片款,按照每个特殊值类型的最小深度取最大 | |
filterGroup = []; | |
if(isLook){ | |
filterGroup.push("LOOK款"); | |
} | |
if(skcNode.displayName!=""){ | |
filterGroup.push("主橱窗"); | |
} | |
if(skcNode.specialTypeName!=""){//此处只有可能是英雄款,D款和大片款已经排除 | |
filterGroup.push("英雄款"); | |
} | |
if(filterGroup.length>0){ | |
var ruleQty = getRuleTableMax(tableRuleT3,"UR_SDS_LowDepth","UR_SDS_SubSpecialType",filterGroup);//根据特殊值过滤取最大 | |
printLog("\t特殊款获取最低深度:isSpecialStyle="+isSpecialStyle+"【"+skcId+"】ruleQty="+ruleQty+" skcMinQty="+skcMinQty); | |
if(skcMinQty<ruleQty){ | |
skcMinQty = ruleQty; | |
} | |
if(skcInitQty<skcMinQty){ | |
skcInitQty = skcMinQty; | |
} | |
//记录最低深度和初始深度 | |
skcNode.minQty = skcMinQty;//取最小值存入当前skc数据中 | |
skcNode.initQty = skcInitQty;//计入初始值中 | |
skcNode.initAmount = price*skcInitQty; //计算初始金额 | |
} | |
} | |
//D款和大片款,单独记录最低值,用于组货完成后,判断D款和大片款的组货深度不能低于最低深度,如果低于则使用最低深度作为组货建议值,并记录超出金额。 | |
if(isDStyle){ | |
filterGroup = []; | |
if(getEnumValue(specialType)=="trailer_dedicated"){ | |
filterGroup.push("大片款"); | |
}else if(getEnumValue(specialType)=="SD"){ | |
filterGroup.push("D款"); | |
} | |
if(filterGroup.length>0){ | |
var ruleQty = getRuleTableMax(tableRuleT3,"UR_SDS_LowDepth","UR_SDS_SubSpecialType",filterGroup);//根据特殊值过滤取最大 | |
printLog("\t特殊款获取最低深度:isDStyle="+isDStyle+"【"+skcId+"】ruleQty="+ruleQty+" skcMinQty="+skcMinQty); | |
if(ruleQty && ruleQty>0){ | |
//记录最低深度和初始深度 | |
skcNode.minQtyD = ruleQty;//记录D款最小深度值存入当前skc数据中,用于最后组货时判断用 | |
} | |
} | |
} | |
}); | |
//===================以上内容为获取最低深度================================ | |
//===================如下执行校验 开始===================================== | |
//6. 初步校验 | |
//6.1判断单号是否为表2中特殊款设定的规则 | |
//6.2skc宽度校验、skc数量校验 | |
//6.2.1检查主题款look数量和skc数量 | |
var modsObj = skcsData.S.mods; | |
var modList = Object.keys(modsObj); | |
//checkSKCLookCount(errMsg,checkOnly,modList,skcsData,ruleTableNode,weekNode,monthNode) | |
checkSKCLookCount(errMsg,false,modList,modsObj,skcsData,ruleTableNode,weekNode,monthNode); | |
//6.2.2常销款、基本款SKC个数校验,价格带校验 规则表1#和9# | |
var checkTypes = ["R","B"]; | |
//(errMsg,checkTypes,skcsData,ruleTableNode,weekNode,monthNode) | |
checkSKCCountAndPriceList(errMsg,checkTypes,skcsData,ruleTableNode,weekNode,monthNode); | |
//6.3按照周目标获取组货宽度、组货金额等目标值, 确认是否需要按照款式宽度校验 | |
//6.3.1只校验常销款和基本款 - 宽度校验 | |
/* 取消常销款、基本款周宽度校验 | |
Object.keys(targetTableNode.weekKey).forEach(function(key){ | |
if(!key.startsWith("S") ){ | |
var weekTargetNode = targetTableNode.weekTarget[key]; | |
var monthTargetNode = weekTargetNode.monthTarget; | |
if(skcsData.categoryKey[key]){ | |
var skcCount = skcsData.categoryKey[key].skcs; //组货内skc数量 | |
var styleCount = skcsData.categoryKey[key].styles; //组货内款式数量 | |
var weekSKCTarget = weekTargetNode.C8_MCMC_GroupGoodsSKC;//周 组货宽度目标 | |
var weekSCKUpperTarget = weekTargetNode.C8_MCMC_ExcessSKCRemaining;//可超宽度 | |
//组货宽度 | |
var weekSKCDepthTarget = weekSKCTarget+weekSCKUpperTarget; | |
var monthTargetDisplay = getMonthTargetKey(monthTargetNode,true,false);//非电商 | |
//主题款不进行校验 | |
if(skcCount>weekSKCDepthTarget){ | |
errMsg.push(monthTargetDisplay+"的实际组货深度为【"+skcCount+"】【大于】周目标的组货宽度目标要求--组货宽度加可超宽度之和:【"+weekSKCDepthTarget+"】"); | |
} | |
} | |
} | |
}); */ | |
printLog("=========初步校验完成===="); | |
//校验完成 | |
if(errMsg.length>0){ | |
printLog("errMsg:\n"+errMsg.join("\n")); | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
jp.close(loading); | |
jp.alert(errMsg.join("</BR>")); | |
return true; | |
} | |
//7. 金额回归计算 | |
var subjetStylesKeys = skcsData.S.categoryKey; | |
var RStylesKeys = skcsData.R.categoryKey; | |
var BStylesKeys = skcsData.B.categoryKey; | |
//记录常销款和基础款的品类Key | |
var RAndBStyleKeys = []; | |
RAndBStyleKeys = RAndBStyleKeys.concat(RStylesKeys).concat(BStylesKeys); | |
//S、R、B全部的key | |
var allStyleKeys = []; | |
allStyleKeys = allStyleKeys.concat(subjetStylesKeys).concat(RStylesKeys).concat(BStylesKeys); | |
//R、B款的全部key | |
var RBCalculationStyles = ["R","B"]; | |
//7.1 常销款、基本款的深度计算 | |
// 判断skc所在款,是否是3个色还是4-6 | |
// 7.1.1 如果是3个色,取三个中skc初始深度值C8_CW_InitialSKCDepth中最大的两个, | |
// 取表5#中的,标准深度(这里有问题,配置表中只能取到一个,应该可以取到2个值,属性名:单点深度取值) | |
// 用初始深度除以标准深度,得到的是覆盖门店数(需要增加属性字段数,向上取整), | |
// 再取其中较小的覆盖门店数,临时保存, 将这个数乘以第三个skc的单点深度取值得到一个组或建议值,这个值跟skc本身的初始组货建议取最大者为这个skc的组货深度建议值, | |
// 其他两个skc的做活深度初始建议值,即为skc本身的初始组货深度值 | |
// 7.1.2 4-6色 | |
// 获取单点深度取值(标准深度,5#表) | |
// 取两个最大的初始组货深度,,然后计算覆盖门店数,也是取最小 | |
// 用覆盖门店数*最小的单点深度取值(标准深度)=最低深度中间值1,然后判断较小的2-4个skc的组货深度总和,是否大于前最低深度中间值1 | |
// 如果大于,则使用各自的初始组货金额最为建议的 | |
// 如果小于,则放大比例到最低深度中间值1, | |
RBCalculationStyles.forEach(function(calType){ | |
skcsData[calType].styles.list.forEach(function(styleId){ | |
var skcsUrlList = skcsData[calType].styles.skcs[styleId]; | |
var skcCount = skcsUrlList.length; | |
//规则上需要判断SKC数量为3个或大于3个,但是计算上是一样的 | |
if(skcCount>=3){ | |
//先做排序,按照组货初始深度从高到底排序C8_CW_InitialSKCDepth | |
var sortSkcsUrlList = skcsUrlList.sort((a,b)=>{return skcsData.list[b].initQty-skcsData.list[a].initQty}); | |
var minShopeCount = 0;//覆盖门店数最低 | |
var minInitDeep = 0; //单点深度取值最低 | |
var lowerSKCSumDeep = 0;//除初始深度最高两个skc以外的所有skc的深度汇总之和,用于后续比较 | |
var fixedSumDeep = 0; //锁定的两个最高深度的skc以外的skc深度之和 | |
for(var k=0;k<skcCount;k++){ | |
var oneSKCurl = sortSkcsUrlList[k]; | |
//只有深度最高的两个才需要获取覆盖门店数 | |
var skcNode = skcsData.list[oneSKCurl]; | |
var userFix = skcNode.userFix; | |
var initQty = skcNode.initQty; | |
var commodityType = skcNode.commodityType; | |
var catId = skcNode.catId; | |
var midCatId = skcNode.midCatId; | |
var keyName = skcNode.categoryKeyName; | |
var shopCoverCount = 0; | |
//获取表5中的标准深度,每个都需要 | |
var standardDeep = 0; | |
var tableRuleT5 = filterRuleTable(ruleTableNode,"5",true,{UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_ProductStyle:monthNode.C8_MC_Style,UR_SDS_ProductLargeType:skcNode.catId,UR_SDS_MiddleCategoryType:midCatId}); | |
if(tableRuleT5 && tableRuleT5.UR_SDS_StanderdDepth>0){ | |
standardDeep = tableRuleT5.UR_SDS_StanderdDepth; | |
skcNode.standardDeep = standardDeep;//将标准深度值记录下来,后续可能需要写入到属性中保存 | |
//前两个取覆盖门店数 | |
if(k<2){ | |
shopCoverCount = parseInt(initQty/standardDeep)+1; | |
skcNode.shopCoverCount = shopCoverCount; | |
if(minShopeCount<shopCoverCount){ | |
minShopeCount = shopCoverCount; | |
} | |
}else{ | |
//计算其他skc的深度汇总,以及判断最低的标准深度 | |
//如果用户锁定skc,那么不做汇总 | |
if(!userFix){ | |
lowerSKCSumDeep += initQty; | |
}else{ | |
fixedSumDeep += initQty; | |
} | |
if(minInitDeep<standardDeep){ | |
minInitDeep = standardDeep; | |
} | |
} | |
}else{ | |
printLog("warning:没有找到表5#标准深度表或者表格中设置的标准深度为0"); | |
} | |
printLog("\t常销款与基本款 "+keyName+" skcId=【"+skcNode.skcId+"】的initQty="+initQty+" standardDeep="+standardDeep+" shopCoverCount="+shopCoverCount); | |
} | |
//再次计算深度 | |
var calTotalDeep = minShopeCount*minInitDeep - fixedSumDeep; //扣减已经锁定的深度和以后,是可以等比放大的量 | |
if(lowerSKCSumDeep<calTotalDeep && lowerSKCSumDeep>0 && calTotalDeep>0){ | |
var scaleUpPct = calTotalDeep/lowerSKCSumDeep; | |
//从第三个开始放大 | |
for(var k=2;k<skcCount;k++){ | |
var oneSKCurl = sortSkcsUrlList[k]; | |
//只有深度最高的两个才需要获取覆盖门店数 | |
var skcNode = skcsData.list[oneSKCurl]; | |
var userFix = skcNode.userFix; | |
if(!userFix){ | |
var initQty = skcNode.initQty; | |
var scaleUpDeep = parseInt(initQty*scaleUpPct)+1; | |
skcNode.initQty = scaleUpDeep;//计算对应的组货深度 | |
printLog("\t常销款与基本款 skcId=【"+skcNode.skcId+"】的initQty="+initQty+" scaleUpPct="+scaleUpPct+" scaleUpDeep="+scaleUpDeep); | |
} | |
} | |
} | |
} | |
}); | |
}); | |
//7.2特殊款-非D款的金额回归计算 | |
//主题款、常销款、基本款,计算金额挂靠 | |
printLog("=========金额回归计算开始===="); | |
allStyleKeys.forEach(function(key){ | |
var skcsList = skcsData.skcs[key]; | |
if(skcsList && skcsList.length>0){ | |
//获取组货目标 | |
var widthQty = skcsList.length;//组货宽度 | |
var wTarget = targetTableNode.weekTarget[key];//周目标 | |
var mTarget = targetTableNode.monthTarget[key];//月目标 | |
if(wTarget && mTarget){ | |
var monthTargetAmount = wTarget.C8_MCMC_GroupGoodsAmount;//企划金额 | |
var colors = mTarget.Colors; | |
//前面单号的企划总金额 | |
var preOrder = 0; | |
//前面单号的已用总金额 | |
var preUseOrder = 0; | |
for(var i=0;i<colors.length;i++){ | |
if(colors[i] == wTarget.$URL){//循环为周自己本身则要跳出循环 | |
continue; | |
} | |
var mcMaterialColorNode = getNode(ac,colors[i]); | |
var marketingLookNode = getNode(ac,mcMaterialColorNode.C8_MCMC_Week); | |
if((marketingLookNode.C8_ML_Status == "UR_ZHStatus:Lock") || (marketingLookNode.C8_ML_Status == "UR_ZHStatus:Complete")){ | |
preOrder = preOrder + mcMaterialColorNode.C8_MCMC_GroupGoodsAmount | |
preUseOrder = preUseOrder + mcMaterialColorNode.C8_MCMC_GroupGoodsAmountFinish-mcMaterialColorNode.C8_MCMC_DAmountFinish; //已经组货金额减掉D款 | |
} | |
} | |
var targetAmount = wTarget.C8_MCMC_GroupGoodsAmount;//组货金额目标 | |
//var targetAmount = monthTargetAmount + preOrder - preUseOrder;//组货金额目标 | |
//var canOverAmount = mTarget.C8_MCM_ExcessAmountRemaining;//可超金额剩余-- | |
//var canOverAmount = mTarget.C8_MCM_ExcessAmount;//可超总金额 | |
//var canDeduceAmount = mTarget.C8_MCM_ReduceAmountRemaining;//可减金额剩余-- | |
//var canDeduceAmount = mTarget.C8_MCM_ReduceAmount;//可减总金额 | |
//周组货目标宽度 | |
var weekTargetSKCWidth = wTarget.C8_MCMC_GroupGoodsSKC;//resultJSON.categoryKey[skcCategoryKey].skcs | |
//实际组货宽度 | |
var actualSKCWidth = skcsData.categoryKey[key].skcs; | |
//当前初始组货金额汇总 | |
//{total:total,newSKCsList:newSKCsList,fixedTotal:fixedTotal}; | |
var sumObj = sumInitAmount(skcsList,"initQty","initAmount","initAmountPct",skcsData); | |
var sumAmount = sumObj.total;//总金额 | |
var sumFixedTotal = sumObj.fixedTotal; //用户锁定的金额 | |
var newSKCsList = sumObj.newSKCsList; | |
//commodityType:commodityType,commodityName:commodityName, | |
//catId:category,catName:categoryName, midCatId:midCategory,midCatName:midCategoryName,productStyle:productStyle, | |
var skcNode = skcsData.list[skcsList[0]]; | |
var keyName = skcNode.categoryKeyName; | |
printLog("分组"+keyName+"组货计算开始==初始组货金额汇总="+sumAmount+" 用户锁定金额="+sumFixedTotal+" 目标组货金额="+targetAmount); | |
var dimention = "UR_enum_Dimension:组货金额"; | |
//目标金额最大和最小 20240408 最大最小分别为周企划金额*上下限,四单逻辑一样 | |
var minAmount = Math.round(targetAmount*weekAmountFloatLower); | |
var maxAmount = Math.round(targetAmount*weekAmountFloatUpper); | |
/*四单逻辑一样 | |
var minAmount = targetAmount-canDeduceAmount; | |
if(isLastWeek){ | |
minAmount = targetAmount; //如果是最后一单,不扣减可扣金额,与检核逻辑保持一致 | |
} | |
//var maxAmount = targetAmount+canOverAmount;*/ | |
var finalTotalAmount = 0;//最终组货金额,周 | |
var finalWeekQty = 0;//最终组货深度,周 | |
var scleDownAmount = 0;//缩小或放大后的金额; | |
printLog("分组"+keyName+"组货计算开始==初始组货金额汇总="+sumAmount+" 用户锁定金额="+sumFixedTotal+" 目标组货金额="+targetAmount+" 可调整金额="+(sumAmount-sumFixedTotal)); | |
printLog("\t目标组货金额最小值="+minAmount+" 目标组货金额最大值="+maxAmount+" 企划宽度="+weekTargetSKCWidth+" 实际宽度="+actualSKCWidth); | |
//组货宽度低于企划宽度时,向最小金额挂靠 | |
if(actualSKCWidth<weekTargetSKCWidth){ | |
if(sumAmount>minAmount && minAmount>sumFixedTotal && sumAmount>sumFixedTotal){ | |
//大于最大目标额区间,进行金额缩小计算,需考虑最小深度要求 | |
var scalePct = (minAmount-sumFixedTotal)/(sumAmount-sumFixedTotal); | |
printLog("\t分组"+keyName+"金额大于目标金额最大值,深度缩小处理 倍率="+scalePct); | |
//计算将initQty缩小后,是否低于最小深度 | |
//return {scaleAmount:scaleSumAmount,success:success,errMsg:errorMsg} | |
var scaleDownResult = scaleSKCs(scalePct,newSKCsList,sumAmount-sumFixedTotal,minAmount-sumFixedTotal,skcsData,1); // 最后一个参数1,表示最后计算完成金额要大于目标值 | |
if(scaleDownResult && scaleDownResult.success){ | |
scleDownAmount = scaleDownResult.scaleAmount; | |
printLog("\t分组"+keyName+"金额大于目标金额最大值,缩放完成 组货总金额="+scleDownAmount); | |
} | |
finalTotalAmount = scleDownAmount; | |
}else if(sumAmount<minAmount){ | |
//小于最小目标额区间,进行金额放大计算,无需考虑最小深度要求 | |
var scalePct = (minAmount - sumFixedTotal)/(sumAmount-sumFixedTotal); | |
printLog("\t分组"+keyName+"金额小于目标金额最小值,深度放大处理 倍率="+scalePct); | |
scleDownAmount = scaleAmount(scalePct,newSKCsList,skcsData,true,1);//// 最后一个参数1,表示最后计算完成金额要大于目标值 | |
printLog("\t分组"+keyName+"金额小于目标金额最小值,深度放大处理 组货总金额="+scleDownAmount); | |
finalTotalAmount = scleDownAmount; | |
} | |
}else{ | |
if(sumAmount>=minAmount && sumAmount<=maxAmount){ | |
printLog("\t分组"+keyName+"金额符合目标区间要求 组货总金额="+sumAmount); | |
finalTotalAmount = sumAmount; | |
}else if(sumAmount<minAmount){ | |
//小于最小目标额区间,进行金额放大计算,无需考虑最小深度要求 | |
var scalePct = (minAmount + wTarget.C8_MCMC_GroupGoodsAvgPriceFinish -sumFixedTotal)/(sumAmount-sumFixedTotal); | |
printLog("\t分组"+keyName+"金额小于目标金额最小值,深度放大处理 倍率="+scalePct); | |
scleDownAmount = scaleAmount(scalePct,newSKCsList,skcsData,true,1);// 最后一个参数1,表示最后计算完成金额要大于目标值 | |
printLog("\t分组"+keyName+"金额小于目标金额最小值,深度放大处理 组货总金额="+scleDownAmount); | |
finalTotalAmount = scleDownAmount; | |
}else if(sumAmount>maxAmount && maxAmount>sumFixedTotal){ | |
//大于最大目标额区间,进行金额缩小计算,需考虑最小深度要求 | |
var scalePct = (maxAmount-sumFixedTotal)/(sumAmount-sumFixedTotal); | |
var totalScaleAmount = sumAmount-maxAmount;//全部需要扣减的金额 | |
printLog("\t分组"+keyName+"金额大于目标金额最大值,深度缩小处理 倍率="+scalePct); | |
//计算将initQty缩小后,是否低于最小深度 | |
//return {scaleAmount:scaleSumAmount,success:success,errMsg:errorMsg} | |
var scaleDownResult = scaleSKCs(scalePct,newSKCsList,sumAmount-sumFixedTotal,maxAmount-sumFixedTotal,skcsData,-1);// 最后一个参数-1,表示最后计算完成金额要小于目标值 | |
if(scaleDownResult && scaleDownResult.success){ | |
scleDownAmount = scaleDownResult.scaleAmount; | |
printLog("\t分组"+keyName+"金额大于目标金额最大值,缩放完成 组货总金额="+scleDownAmount); | |
} | |
// 不符合时,不提示错误,依然保存结果else{ | |
//else{ | |
// var err = "\t分组"+keyName+"金额大于目标金额最大值,缩放出现错误:"+scaleDownResult.errMsg; | |
// printLog(err); | |
// errMsg.push(err); | |
// } | |
finalTotalAmount = scleDownAmount; | |
} | |
} | |
}else{ | |
var skcNode = skcsData.list[skcsList[0]]; | |
var keyName = skcNode.categoryKeyName; | |
var err = "没有找到品类"+keyName+"的周目标,不能组货!"; | |
printLog(err); | |
errMsg.push(err); | |
} | |
} | |
}); | |
printLog("=========金额回归计算完成===="); | |
printLog("=========常销款、基本款平均价回归计算开始===="); | |
RAndBStyleKeys.forEach(function(key){ | |
var skcsList = skcsData.skcs[key]; | |
if(skcsList && skcsList.length>0){ | |
//获取组货目标,按照单价由高到底排序 | |
var sortSkcsPriceList = skcsList.sort((a,b)=>{return skcsData.list[b].price-skcsData.list[a].price}); | |
var widthQty = skcsList.length;//组货宽度 | |
var wTarget = targetTableNode.weekTarget[key];//周目标 | |
var mTarget = targetTableNode.monthTarget[key];//月目标 | |
if(wTarget && mTarget){ | |
var monthTargetAmount = mTarget.C8_MCM_PlannedAmount;//企划金额 | |
var targetAmount = wTarget.C8_MCMC_GroupGoodsAmount;//组货金额目标 | |
var canOverAmount = mTarget.C8_MCM_ExcessAmountRemaining;//可超金额剩余-- | |
var canDeduceAmount = mTarget.C8_MCM_ReduceAmountRemaining;//可减金额剩余-- | |
var avgPriceUp = mTarget.C8_MCM_AvgPriceHigh; | |
var avgPriceDown = mTarget.C8_MCM_AvgPriceLow; | |
//目标金额最大和最小 | |
var minAmount = targetAmount-canDeduceAmount; | |
var maxAmount = targetAmount+canOverAmount; | |
//获取skc品类信息,用于日志输出 | |
var skcNode = skcsData.list[skcsList[0]]; | |
var keyName = skcNode.categoryKeyName; | |
//当前初始组货金额汇总 | |
//{totalSumAmount:总金额,fixedAmount:已锁定总金额,nonFixedAmount:未锁定总金额,avgPrice:平均价,totalQty:总深度}; | |
var sumAmountObj = sumSKCAmount(sortSkcsPriceList,skcsData); | |
var sumAmount = sumAmountObj.totalSumAmount; | |
var avgPrice = sumAmountObj.avgPrice; | |
var initSortSkcsPriceList = getNonUserFixedList(sortSkcsPriceList,skcsData);//非锁定的skc列表,用于成对的增加深度和扣减深度 | |
printLog("分组"+keyName+"平均价回归计算==初始平均价="+avgPrice+" 平均价上限="+avgPriceUp+" 平均价下限="+avgPriceDown); | |
var finalTotalAmount = 0;//最终组货金额,周 | |
var finalWeekQty = 0;//最终组货深度,周 | |
var scleDownAmount = 0;//缩小或放大后的金额; | |
if(avgPrice>=avgPriceDown && avgPrice<=avgPriceUp){ | |
printLog("分组"+keyName+"平均价回归计算==平均价在上下限范围内,无需计算==完成"); | |
}else if(avgPrice<avgPriceDown){ | |
//平均价比较低,所以需要增加大于平均价的的skc的深度,同时减少低于平均价的skc的深度,此时总金额可能呈现上升趋势 | |
printLog("分组"+keyName+"平均价回归计算==平均价在下限范围以下,需调高平均价"); | |
avgPrice = scaleUpAvgPrice(sortSkcsPriceList,initSortSkcsPriceList,skcsData,avgPrice,avgPriceDown,sumAmount,minAmount,maxAmount,1,0); | |
printLog("分组"+keyName+"平均价回归计算==平均价在下限范围以下,需调高平均价==完成==avgPrice="+avgPrice); | |
}else if(avgPrice>avgPriceUp){ | |
//平均价比较高,所以需要减少大于平均价的的skc的深度,同时增加低于平均价的skc的深度,此时总金额可能呈现下降趋势 | |
printLog("分组"+keyName+"平均价回归计算==平均价在上限范围以上,需调低平均价"); | |
avgPrice = scaleDownAvgPrice(sortSkcsPriceList,initSortSkcsPriceList,skcsData,avgPrice,avgPriceUp,sumAmount,minAmount,maxAmount,1,0); | |
printLog("分组"+keyName+"平均价回归计算==平均价在上限范围以上,需调低平均价==完成==avgPrice="+avgPrice); | |
} | |
}else{ | |
var skcNode = skcsData.list[skcsList[0]]; | |
var keyName = skcNode.categoryKeyName; | |
var err = "没有找到品类"+keyName+"的周目标,不能组货!"; | |
printLog(err); | |
errMsg.push(err); | |
} | |
} | |
}); | |
printLog("=========常销款、基本款平均价回归计算完成===="); | |
printLog("=========计算完成、开始保存数据===="); | |
//计算完成 | |
if(errMsg.length>0){ | |
printLog("errMsg:\n"+errMsg.join("\n")); | |
var errorMessage = errMsg.join("</BR>"); | |
//如果长度超过1000,则截取1000个字符,避免过长保存出错 | |
if(errorMessage.length > 1000){ | |
errorMessage = errorMessage.substring(0,1000); | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",errorMessage); | |
jp.close(loading); | |
jp.alert(errMsg.join("</BR>")); | |
return true; | |
}else{ | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Errors","string",""); | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Lock");//组货结果状态,锁定SKC可编辑 | |
} | |
printLog("=========没有错误,保存计算结果===="); | |
//8. 保存数据,返回结果 | |
//8.1 检查数据是否有结果,将结果写入skc,先处理主题款结果写入 | |
//主题款、常销款、基本款的计算结果保存 | |
allStyleKeys.forEach(function(key){ | |
var skcsList = skcsData.skcs[key]; | |
var totalExceedAmountDStyle = 0;//D款和大片款超出金额计算 | |
if(skcsList && skcsList.length>0){ | |
//获取组货目标 | |
var widthQty = skcsList.length;//组货宽度 | |
var wTarget = targetTableNode.weekTarget[key];//周目标 | |
var mTarget = targetTableNode.monthTarget[key];//月目标 | |
var finalTotalAmount = 0; | |
var finalWeekQty = 0; | |
if(wTarget && mTarget){ | |
skcsList.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
var isDStyle = skcNode.isDStyle; | |
var initQty = skcNode.initQty; | |
var minQty = skcNode.minQty; | |
var minQtyD = skcNode.minQtyD; | |
var price = skcNode.price; | |
var userFix = skcNode.userFix; | |
var dAmount = 0;//D款和大片款超出金额 | |
if(isDStyle){ | |
if(initQty<minQtyD){ | |
dAmount = (minQtyD-initQty)*price; | |
printLog("\tskc【"+skcNode.skcName+"】为D款大片款,initQty"+initQty+" minQtyD="+minQtyD+" 超出金额=="+dAmount); | |
totalExceedAmountDStyle += dAmount;//D款大片款超出金额 | |
initQty = minQtyD; | |
} | |
//如果是D款,非特殊款等情况,没有最低深度限制,则获取D款大片款的最低深度 | |
if(minQty==0 && minQtyD>0){ | |
minQty = minQtyD; | |
} | |
} | |
var amount = price*initQty; | |
finalTotalAmount += amount;//周组货总金额 | |
finalWeekQty += initQty; //组货深度 | |
var mcpPrice = skcNode.mcpPrice; | |
if(initQty!=0){ | |
ac.m_writer.changeNode(skcNode.mcpId) | |
.changeAttribute("C8_MCP_SuggestedDepth","integer",initQty) | |
.changeAttribute("C8_MCP_SuggestedAmount","double",amount) | |
.changeAttribute("C8_MCP_DLowDepth","integer",minQtyD) | |
.changeAttribute("C8_MCP_DExcessAmount","double",dAmount); | |
if(!(skcNode.look1 || skcNode.look2 || skcNode.look3|| skcNode.look4|| skcNode.look5|| skcNode.look6)){ | |
ac.m_writer.changeNode(skcNode.mcpId).changeAttribute("C8_MCP_SpecialLowDepth","integer",minQty); | |
}else{ | |
ac.m_writer.changeNode(skcNode.mcpId).changeAttribute("C8_MCP_SpecialLowDepth","integer",0); | |
} | |
//南北款,D款,大片款,英雄款, 主橱窗款 | |
if(skcNode.channelType == "UR_enum_NSStyle:01" ||skcNode.channelType == "UR_enum_NSStyle:02" || skcNode.specialType == "UR_enum_Special:SD" || skcNode.specialType == "UR_enum_Special:trailer_dedicated" || skcNode.specialType == "UR_enum_Special:hero_dedicated" || skcNode.display == "UR_enum_DisplayType:DZ" || skcNode.display == "UR_enum_DisplayType:DW"){ | |
ac.m_writer.changeNode(skcNode.mcpId).changeAttribute("C8_MCP_SpecialLowDepth","integer",minQty); | |
} | |
} | |
if(!userFix){ | |
ac.m_writer.changeNode(skcNode.mcpId).changeAttribute("C8_MCP_AdjustingDepth","integer",initQty); | |
} | |
if(price!=mcpPrice){ | |
ac.m_writer.changeNode(skcNode.mcpId).changeAttribute("C8_MCP_Price","double",price); | |
} | |
}); | |
printLog("\t组货key=【"+key+"】完成,组货金额="+finalTotalAmount+" 组货宽度="+widthQty+" 组货深度=="+finalWeekQty +" D款大片款超出金额="+totalExceedAmountDStyle); | |
} | |
} | |
}); | |
printLog("=========保存计算结果完成===="); | |
//9. 结束返回 | |
jp.close(loading); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
//重新加载页面 | |
window.location.reload(); | |
return true; | |
}, | |
//国内组货确认 | |
C8_GuoNeiConfirm:function(ac){ | |
var currentNode = routerStore.locationNode; | |
//是否设计师系列 | |
var isDesignerStyle = false; | |
if(currentNode.$Type == "MarketingCollection"){ | |
isDesignerStyle = (currentNode.C8_MC_Style == "UR_enum_ProductStyle:WA" ? true : false); | |
} | |
var loadingMessage = "正在执行组货确认,请耐心等待................"; | |
var delim = "</BR>"; | |
var loading = jp.loading(loadingMessage); | |
debugger | |
var weekURL = ac.m_urlParent; | |
var weekNode = getNode(ac,weekURL); | |
ac.m_writer.execute({sync: true}); | |
var errorMsg = checkRequiredToConfirm(ac, 1); | |
if (errorMsg) { | |
jp.alert(errorMsg); | |
return | |
} | |
var flag = false; | |
flag = ConfirmGuoNeiZHV2(ac, false, false, flag, isDesignerStyle); | |
//结束返回 | |
jp.close(loading); | |
var groupOrderAattribute = null; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
if(flag){ | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
c.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
if(flag){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.refreshData(); | |
} | |
if(flag){ | |
var LookProducts = weekNode.LookProducts; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 0); | |
} | |
//记录第一次买手确认的时间 | |
if(weekNode.C8_ML_CompleteTime == 0){ | |
ac.m_writer.changeNode(weekURL).changeAttributeExp("C8_ML_CompleteTime", "nowTime()", true); | |
} | |
//设置SKC下买手确认的时间 | |
var LookProducts = weekNode.LookProducts; | |
for(var i =0;i<LookProducts.length;i++){ | |
var lookProductNode = getNode(ac,LookProducts[i]); | |
var skcNode = getNode(ac,lookProductNode.C8_MCP_SKC); | |
if(skcNode.C8_CW_CompleteTime == 0){ | |
ac.m_writer.changeNode(skcNode.$URL).changeAttributeExp("C8_CW_CompleteTime", "nowTime()", true); | |
} | |
} | |
// ac.m_writer.execute({sync: true}); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
if(flag){ | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
} | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
if(flag){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
} | |
ac.widget.refreshData(); | |
} | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "组货确认消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已确认";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
} | |
return true; | |
}, | |
//国内组货强制确认 | |
C8_GuoNeiConfirmForce:function(ac){ | |
var currentNode = routerStore.locationNode; | |
//是否设计师系列 | |
var isDesignerStyle = false; | |
if(currentNode.$Type == "MarketingCollection"){ | |
isDesignerStyle = (currentNode.C8_MC_Style == "UR_enum_ProductStyle:WA" ? true : false); | |
} | |
var loadingMessage = "正在执行组货强制确认,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
var errorMsg = checkRequiredToConfirm(ac, 1); | |
if (errorMsg) { | |
jp.alert(errorMsg); | |
return | |
} | |
var flag = true; | |
//错误信息声明 | |
ConfirmGuoNeiZHV2(ac,true,false,flag,isDesignerStyle); | |
//结束返回 | |
jp.close(loading); | |
var weekURL = ac.m_urlParent; | |
var weekNode = getNode(ac,weekURL); | |
var groupOrderAattribute = null; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
if(flag){ | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
if(flag){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.refreshData(); | |
} | |
if (flag){ | |
var LookProducts = weekNode.LookProducts; | |
for(var i =0;i<LookProducts.length;i++){ | |
var lookProductNode = getNode(ac,LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 0); | |
} | |
} | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "组货确认消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已确认";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
return true; | |
}, | |
//组货确认校验通过后-邏輯 | |
C8_ConfirmLogic:function(ac, lookProductNode, currentNode){ | |
var styleUrl = lookProductNode.ProductStyle; | |
var style = getNode(ac,styleUrl); | |
var styleAttr = getNode(ac,style.Attributes); | |
if(!styleAttr.UR_StyleAttributes_GroupBillNo){ | |
ac.m_writer.changeNode(styleAttr.$URL).changeAttribute("UR_StyleAttributes_GroupBillNo","enum",currentNode.C8_ML_Week); | |
} | |
var colorwayUrl = lookProductNode.C8_MCP_SKC; | |
var colorway = getNode(ac,colorwayUrl); | |
if (!colorway.UR_Colorway_OKCode) { | |
var monthNodeUrl = lookProductNode.__Parent__; | |
var monthNode = getNode(ac,monthNodeUrl); | |
var orderType = getEnumValue(monthNode.C8_MC_MonthOrderAattribute); | |
if(orderType && (orderType==="E" || orderType==="F" || orderType==="T")){ | |
// 如果是应急单,则填坑式组货 | |
ac.m_writer.changeNode(colorwayUrl).changeAttribute("UR_Colorway_OKCode","string",colorway.UR_Colorway_GroUnCode); | |
}else{ | |
// 模块最大化组货 | |
ac.m_writer.changeNode(colorwayUrl).changeAttribute("UR_Colorway_OKCode","string",colorway.UR_Colorway_PLMUniqueValue); | |
} | |
} | |
}, | |
//国内组货检核 | |
C8_GuoNeiCheck:function(ac){ | |
var currentNode = routerStore.locationNode; | |
//是否设计师系列 | |
var isDesignerStyle = false; | |
if(currentNode.$Type == "MarketingCollection"){ | |
isDesignerStyle = (currentNode.C8_MC_Style == "UR_enum_ProductStyle:WA" ? true : false); | |
} | |
var loadingMessage = "正在执行组货检核,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
var flag = true; | |
//错误信息声明 | |
ConfirmGuoNeiZHV2(ac,false,true,flag,isDesignerStyle); | |
//结束返回 | |
jp.close(loading); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
if (ac.widget.viewParent.getChildView("MCMaterials") != undefined) { | |
ac.widget.viewParent.getChildView("MCMaterials").refreshData(); | |
} | |
return true; | |
}, | |
//电商组货计算 | |
C8_DianShangCalculate:function(ac) { | |
var currentNode = routerStore.locationNode; | |
var loadingMessage = "正在执行组货计算,请耐心等待................"; | |
var delim = "</BR>"; | |
var loading = jp.loading(loadingMessage); | |
var processingTime = "总执行时间:"; | |
var stepInfo = ""; | |
var weekURL = ac.m_urlParent; | |
printLog("========电商组货开始执行=========="); | |
var weekNode = getNode(ac,weekURL); | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
//1+.获取品类管控规则表 Agnes 20240223 品类管控变更 | |
var controlRuleKeys = searchControlRules(monthNode); | |
//2.获取目标表 | |
var targetTableNode = searchTargetTableDianShang(weekNode); | |
printLog("获取规则表,目标表完成"); | |
//3.获取计算skc数据表所需要的数据信息 | |
var resultURLs = weekNode.LookProducts;//ac.widget.getQueryResult().getChildResultUrls(); | |
//4. 获取计算所需要的数据,封装到JSON中,便于后续校验和计算 | |
var skcsData = getDianShangGroupSKCData(ac,resultURLs,controlRuleKeys,false); | |
//6. 开始计算 | |
Object.keys(skcsData.categoryKey).forEach(function(key){ | |
var categoryObj = skcsData.categoryKey[key]; | |
var wTarget = targetTableNode.weekTarget[key];//周目标 | |
var mTarget = targetTableNode.monthTarget[key];//月目标 | |
if(mTarget && wTarget){ | |
//5. 获取规则表中D款的最低深度 20240409 新增商品层、品类、中品类过滤 | |
var tableRuleK = filterRuleTable(ruleTableNode,"K",true,{UR_SDS_Month:monthNode.C8_MC_Month,UR_SDS_CommodityType:mTarget.C8_MCM_CommodityType,UR_SDS_ProductLargeType:mTarget.C8_MCM_ProductLargeType,UR_SDS_MiddleCategoryType:mTarget.C8_MCM_CategoryInPlan}); | |
var minQtyDStyle = 0; | |
if(tableRuleK && tableRuleK.UR_SDS_DLowDepth){ | |
minQtyDStyle = tableRuleK.UR_SDS_DLowDepth; | |
} | |
//var wTargetAmount = wTarget.C8_MCMC_GroupGoodsAmount;//企划金额 | |
//var wTargetSKCs = wTarget.C8_MCMC_GroupGoodsSKC;//企划宽度 | |
var planStyleDeep = mTarget.C8_MCM_PlannedStyleDepth; | |
var averageAmount = 0; | |
var skcMinQty = 0; | |
var widthQty = categoryObj.list.length;//组货宽度 | |
var finalTotalAmount = 0; | |
var finalWeekQty = 0; | |
categoryObj.list.forEach(function(skcId){ | |
var skcNode = skcsData.list[skcId]; | |
var mcpId = skcNode.mcpId; | |
var isDStyle = skcNode.isDStyle; | |
var initQty = planStyleDeep; | |
var price = skcNode.price; | |
var isDStyle = skcNode.isDStyle; | |
var userFix = skcNode.userFix; | |
var minQty = 0; | |
//20240409 Agnes 普通款最低深度获取新增订单属性、商品层、风格、电商级别过滤 | |
var tableRuleX = filterRuleTable(ruleTableNode,"X",true,{UR_SDS_GroupOrderAattribute:monthNode.C8_MC_MonthOrderAattribute,UR_SDS_CommodityType:skcNode.commodityType,UR_SDS_ProductStyle:monthNode.C8_MC_Style,UR_SDS_DSLevel:skcNode.suggestClass,UR_SDS_ProductLargeType:mTarget.C8_MCM_ProductLargeType,UR_SDS_MiddleCategoryType:mTarget.C8_MCM_CategoryInPlan}); | |
if(tableRuleX && tableRuleX.UR_SDS_LowDepth){ | |
skcMinQty = tableRuleX.UR_SDS_LowDepth; | |
} | |
if(isDStyle){ | |
minQty = minQtyDStyle; | |
}else{ | |
minQty = skcMinQty; | |
} | |
var initAmount = initQty*price; | |
var classLevel = skcNode.suggestClass; | |
finalTotalAmount +=initAmount;//记录组货完成金额 | |
finalWeekQty += initQty;//记录组货深度 | |
var mcpPrice = skcNode.mcpPrice; | |
//if(initQty!=0){去掉目标组货深度条件 | |
//var suggestClass = getClassLevel(initQty,classLevelKey,targetTableNode); | |
ac.m_writer.changeNode(mcpId) | |
.changeAttribute("C8_MCP_SuggestedDepth","integer",initQty) | |
.changeAttribute("C8_MCP_SuggestedAmount","double",initAmount) | |
.changeAttribute("C8_MCP_AdjustingLevel","enum",classLevel)//组货等级 | |
.changeAttribute("C8_MCP_SpecialLowDepth","integer",minQty);//只有D款有最低深度 | |
if(price!=mcpPrice){ | |
ac.m_writer.changeNode(mcpId).changeAttribute("C8_MCP_Price","double",price); | |
} | |
if(!userFix){ | |
ac.m_writer.changeNode(mcpId).changeAttribute("C8_MCP_AdjustingDepth","integer",initQty); | |
} | |
//} | |
}); | |
printLog("\t组货key=【"+key+"】完成,组货金额="+finalTotalAmount+" 组货宽度="+widthQty+" 组货深度=="+finalWeekQty); | |
//将结果写入到周目标上 - 临时,后续改到组货确认时计算 | |
ac.m_writer.changeNode(wTarget.$URL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish","double",finalTotalAmount);//组货金额 | |
ac.m_writer.changeNode(wTarget.$URL).changeAttribute("C8_MCMC_GroupGoodsSKCFinish","integer",widthQty);//组货宽度 | |
ac.m_writer.changeNode(wTarget.$URL).changeAttribute("C8_MCMC_GroupGoodsDepthFinish","integer",finalWeekQty);//组货深度 | |
if(finalWeekQty!=0){ | |
ac.m_writer.changeNode(wTarget.$URL).changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish","double",finalTotalAmount/finalWeekQty);//组货深度平均价 | |
} | |
} | |
}); | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Lock");//组货结果状态,锁定SKC可编辑 | |
printLog("=========保存计算结果完成===="); | |
//9. 结束返回 | |
jp.close(loading); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
//重新加载页面 | |
window.location.reload(); | |
return true; | |
}, | |
//电商组货确认 | |
C8_DianShangConfirm:function(ac) { | |
var currentNode = routerStore.locationNode; | |
var loadingMessage = "正在执行组货确认,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
//是否设计师系列 | |
var isDesignerStyle = false; | |
if(currentNode.$Type == "MarketingCollection"){ | |
isDesignerStyle = (currentNode.C8_MC_Style == "UR_enum_ProductStyle:WA" ? true : false); | |
} | |
var errorMsg = checkRequiredToConfirm(ac, 2); | |
if (errorMsg) { | |
jp.alert(errorMsg); | |
return | |
} | |
var flag = DianShangConfirmZH(ac, false, false, isDesignerStyle); | |
//9. 结束返回 | |
jp.close(loading); | |
if(flag){ | |
var weekURL = ac.m_urlParent; | |
var weekNode = getNode(ac,weekURL); | |
//设置C8_CW_DSChangeTag 为false | |
var LookProducts = weekNode.LookProducts; | |
for(var i =0;i<LookProducts.length;i++){ | |
var lookProductNode = getNode(ac,LookProducts[i]); | |
var skcNode = getNode(ac,lookProductNode.C8_MCP_SKC); | |
if(skcNode.C8_CW_CompleteTime){ | |
ac.m_writer.changeNode(skcNode.$URL).changeAttribute("C8_CW_DSChangeTag", "boolean", false); | |
} | |
} | |
// var LookProducts = weekNode.LookProducts; | |
// for(var i =0;i<LookProducts.length;i++){ | |
// var lookProductNode = getNode(ac,LookProducts[i]); | |
// this.C8_ConfirmLogic(ac, lookProductNode, currentNode); | |
// var colorwayUrl = lookProductNode.C8_MCP_SKC; | |
// var storeVolumnSum = 0; | |
// var storeVolumnObj = lookProductNode.C8_MCP_StoreVolumn; | |
// if (storeVolumnObj && JSON.stringify(storeVolumnObj) != '{}') { | |
// for(let key in storeVolumnObj) { | |
// if (storeVolumnObj.hasOwnProperty(key)) { | |
// storeVolumnSum += storeVolumnObj[key]; // 将每个属性值加到求和变量上 | |
// } | |
// } | |
// } | |
// ac.m_writer.changeNode(colorwayUrl).changeAttribute("C8_CW_DSDepth","integer",storeVolumnSum); | |
// } | |
// ac.m_writer.execute({sync: true}); | |
var groupOrderAattribute = null; | |
if (currentNode && currentNode.$Type == "MarketingLook") { | |
if (flag) { | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.viewParent.refreshData(); | |
} else if (currentNode && currentNode.$Type == "MarketingCollection") { | |
if (flag) { | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.refreshData(); | |
} | |
if (flag) { | |
var LookProducts = weekNode.LookProducts; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 1); | |
} | |
} | |
//0605 电商组货取消发送通知 | |
/*var mentions = getGroup(ac, "电商买手"); | |
var subject = "组货确认消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已确认";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments);*/ | |
} | |
//刷新数据 | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.viewParent.refreshData(); | |
} | |
return true; | |
}, | |
//电商强制确认 | |
C8_DianShangConfirmForce:function(ac) { | |
var currentNode = routerStore.locationNode; | |
var loadingMessage = "正在执行组货确认,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
var flag = true; | |
//是否设计师系列 | |
var isDesignerStyle = false; | |
if(currentNode.$Type == "MarketingCollection"){ | |
isDesignerStyle = (currentNode.C8_MC_Style == "UR_enum_ProductStyle:WA" ? true : false); | |
} | |
var errorMsg = checkRequiredToConfirm(ac, 2); | |
if (errorMsg) { | |
jp.alert(errorMsg); | |
return | |
} | |
DianShangConfirmZH(ac, true, false, isDesignerStyle); | |
//9. 结束返回 | |
jp.close(loading); | |
var weekURL = ac.m_urlParent; | |
var weekNode = getNode(ac,weekURL); | |
// ac.m_writer.execute({sync: true}); | |
var groupOrderAattribute = null; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
if (flag) { | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
if (flag) { | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
} | |
ac.widget.refreshData(); | |
} | |
if (flag) { | |
var LookProducts = weekNode.LookProducts; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, true, 1); | |
} | |
} | |
//0605 电商确认时取消发送通知 | |
// var mentions = getGroup(ac, "电商买手"); | |
// var subject = "组货确认消息";//主题 | |
// var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已确认";//消息文本 | |
// var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
// var docContainer = monthNode.DocumentsAndComments; | |
// createConversation(ac, docContainer, subject, mentions, comments); | |
//重新加载页面 | |
window.location.reload(); | |
return true; | |
}, | |
//电商检核 | |
C8_DianShangCheck:function(ac) { | |
var currentNode = routerStore.locationNode; | |
var loadingMessage = "正在执行组货检核,请耐心等待................"; | |
var loading = jp.loading(loadingMessage); | |
//是否设计师系列 | |
var isDesignerStyle = false; | |
if(currentNode.$Type == "MarketingCollection"){ | |
isDesignerStyle = (currentNode.C8_MC_Style == "UR_enum_ProductStyle:WA" ? true : false); | |
} | |
DianShangConfirmZH(ac, false, true, isDesignerStyle) | |
//9. 结束返回 | |
jp.close(loading); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.viewParent.refreshData(); | |
} | |
return true; | |
}, | |
//展示错误信息 | |
C8_ShowError:function(ac) { | |
var mlNode = getNode(ac,ac.m_urlParent); | |
var errorMsg = mlNode.C8_ML_Errors; | |
if(errorMsg){ | |
jp.alert("当前错误信息如下:</BR>"+errorMsg); | |
}else{ | |
jp.success("当前没有错误信息!"); | |
} | |
return true; | |
}, | |
//有错误时,才显示按钮 | |
C8_ShowErrorAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
if(contextNode && contextNode.$Type=="MarketingLook"){ | |
var errors = contextNode.C8_ML_Errors; | |
if(errors!=""){ | |
hasAccess = true; | |
} | |
} | |
return hasAccess; | |
}, | |
//海外组货确认 | |
C8_HaiWaiConfirm:function(ac) { | |
HaiWaiCalculate(ac,true,false); | |
return true; | |
}, | |
//海外组货强制确认 第三个参数控制强制 | |
C8_HaiWaiQZConfirm:function(ac){ | |
HaiWaiCalculate(ac,true,true); | |
return true; | |
}, | |
//海外组货计算 Jarivis | |
C8_HaiWaiCalculate:function (ac) { | |
HaiWaiCalculate(ac,false,false); | |
return true; | |
}, | |
//欧美组货确认 | |
C8_HaiWaiConfirmOM:function(ac) { | |
HaiWaiCalculateOM(ac,true,false); | |
return true; | |
}, | |
//欧美组货强制确认 第三个参数控制强制 | |
C8_HaiWaiQZConfirmOM:function(ac){ | |
HaiWaiCalculateOM(ac,true,true); | |
return true; | |
}, | |
//欧美组货计算 Jarivis | |
C8_HaiWaiCalculateOM:function (ac) { | |
HaiWaiCalculateOM(ac,false,false); | |
return true; | |
}, | |
//点击组货按钮带出产品等级 | |
C8_setStoreLevel:function(ac){ | |
var MCProductNode = getNode(ac,ac.m_urlNode); | |
var colorNode = getNode(ac,MCProductNode.C8_MCP_SKC); | |
var level = colorNode.C8_CW_StoreLevel; | |
var levelList = Object.entries(MCProductNode.C8_MCP_StoreLevel); | |
var lockhy = MCProductNode.C8_MCP_SKCLockhy; | |
var map = new Map(); | |
for (var t = 0; t < levelList.length; t++) { | |
if(lockhy[levelList[t][0]] == undefined || !lockhy[levelList[t][0]]) { | |
map[levelList[t][0]] = level; | |
} | |
} | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "Customer"); | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if(results){ | |
results.forEach(function(customer){ | |
var customerUrl = customer.$URL; | |
map.set(customerUrl, level) | |
}); | |
} | |
ac.m_writer.changeNode(MCProductNode.$URL).changeAttribute("C8_MCP_StoreLevel","enummap",map,true,false); | |
ac.m_writer.execute({sync:true}); | |
return true; | |
}, | |
//从单号中移除组货SKC后删除对应MCProdwuct | |
C8_PostDeleteMCP:function(ac){ | |
var mcp = ac.m_urlNode; | |
var mcpNode = getNode(ac,mcp); | |
var viewId = ac.widget.defView.m_id; | |
var attName = ""; | |
if(viewId=="MCProducts"){ | |
attName = "C8_CW_GNPick"; | |
}else if(viewId=="C8_MCProductsDS"){ | |
attName = "C8_CW_DSPick"; | |
}else if(viewId=="C8_GroupGoodsGallery"){ | |
attName = "C8_CW_HWPick"; | |
} | |
if(attName !="" && mcpNode && mcpNode.C8_MCP_SKC && mcpNode.C8_MCP_SKC!="centric:"){ | |
ac.m_writer.changeNode(mcpNode.C8_MCP_SKC).changeAttribute(attName,"boolean",false); | |
} | |
ac.m_writer.deleteNode(mcp,true); | |
ac.m_writer.execute({sync:true}); | |
return true; | |
}, | |
//锁定组货页面 | |
C8_LockWeek:function(ac){ | |
var currentNode = routerStore.locationNode; | |
var weekURL = ac.m_urlParent; | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Lock"); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
return true; | |
}, | |
//解锁组货页面 | |
C8_UnLockWeek:function(ac){ | |
var currentNode = routerStore.locationNode; | |
var weekURL = ac.m_urlParent; | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Start"); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
var weekURL = ac.m_urlParent; | |
var weekNode = getNode(ac,weekURL); | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "组货取消消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "标签已解锁";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
//重新加载页面 | |
window.location.reload(); | |
return true; | |
}, | |
//欧美组货取消 | |
C8_HaiWaiCancellConfirmOM:function(ac){ | |
var weekURL = ac.m_urlParent; | |
var currentNode = routerStore.locationNode; | |
var weekNode = getNode(ac,weekURL); | |
let sameMeg = checkSameMLIsZHing(ac,weekURL); | |
if (sameMeg) { | |
jp.alert(sameMeg); | |
return sameMeg; | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Start"); | |
//取消时更新数据 20240408 | |
HaiWaiCalculateClean(ac); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "组货取消消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已取消";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
var LookProducts = weekNode.LookProducts; | |
for(var i =0;i<LookProducts.length;i++){ | |
var lookProductNode = getNode(ac,LookProducts[i]); | |
var skcNode = getNode(ac,lookProductNode.C8_MCP_SKC); | |
ac.m_writer.changeNode(skcNode.$URL).changeAttribute("C8_CW_HWDepth","integer","0"); | |
// this.C8_CancellConfirmCleanData(ac, lookProductNode); | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,skcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, false,true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, false,true); | |
} | |
var groupOrderAattribute = null; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.refreshData(); | |
} | |
var LookProducts = weekNode.LookProducts; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, false, 2); | |
} | |
if (ac.widget.viewParent.getChildView("C8_MCMaterialsHW") != undefined) { | |
ac.widget.viewParent.getChildView("C8_MCMaterialsHW").refreshData(); | |
} | |
return true; | |
}, | |
//海外组货取消 | |
C8_HaiWaiCancellConfirm:function(ac){ | |
var weekURL = ac.m_urlParent; | |
var currentNode = routerStore.locationNode; | |
var weekNode = getNode(ac,weekURL); | |
let sameMeg = checkSameMLIsZHing(ac,weekURL); | |
if (sameMeg) { | |
jp.alert(sameMeg); | |
return sameMeg; | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Start"); | |
//取消时更新数据 20240408 | |
HaiWaiCalculateClean(ac); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "组货取消消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已取消";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
var LookProducts = weekNode.LookProducts; | |
for(var i =0;i<LookProducts.length;i++){ | |
var lookProductNode = getNode(ac,LookProducts[i]); | |
var skcNode = getNode(ac,lookProductNode.C8_MCP_SKC); | |
ac.m_writer.changeNode(skcNode.$URL).changeAttribute("C8_CW_HWDepth","integer","0"); | |
// this.C8_CancellConfirmCleanData(ac, lookProductNode); | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,skcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, false,true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, false,true); | |
} | |
var groupOrderAattribute = null; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.refreshData(); | |
} | |
var LookProducts = weekNode.LookProducts; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, false, 2); | |
} | |
if (ac.widget.viewParent.getChildView("C8_MCMaterialsHW") != undefined) { | |
ac.widget.viewParent.getChildView("C8_MCMaterialsHW").refreshData(); | |
} | |
return true; | |
}, | |
//电商组货取消 | |
C8_DianShangCancellConfirm:function(ac){ | |
var weekURL = ac.m_urlParent; | |
var currentNode = routerStore.locationNode; | |
var weekNode = getNode(ac,weekURL); | |
let sameMeg = checkSameMLIsZHing(ac,weekURL); | |
if (sameMeg) { | |
jp.alert(sameMeg); | |
return sameMeg; | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Start"); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
//0605 电商取消 不发送通知 | |
// var mentions = getGroup(ac, "海外买手"); | |
// var mentions1 = getGroup(ac, "电商买手"); | |
// mentions.concat(mentions1); | |
// var subject = "组货取消消息";//主题 | |
// var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已取消";//消息文本 | |
// var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
// var docContainer = monthNode.DocumentsAndComments; | |
// createConversation(ac, docContainer, subject, mentions, comments); | |
var LookProducts = weekNode.LookProducts; | |
for(var i =0;i<LookProducts.length;i++){ | |
var lookProductNode = getNode(ac,LookProducts[i]); | |
var skcNode = getNode(ac,lookProductNode.C8_MCP_SKC); | |
ac.m_writer.changeNode(skcNode.$URL).changeAttribute("C8_CW_DSDepth","integer","0"); | |
// this.C8_CancellConfirmCleanData(ac, lookProductNode); | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,skcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, false,true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, false,true); | |
} | |
var groupOrderAattribute = null; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.refreshData(); | |
} | |
//设置周目标上的组货结果重置为0 | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL); | |
//.Attr("UR_MCMC_Control", xml.OP_EQUALS, true);不止更新强管控目标 | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
for(var i=0; i<results.length; i++){ | |
var mcmc = results[i]; | |
ac.m_writer.changeNode(mcmc.$URL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", 0)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish", "double", 0)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "integer", 0)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", 0)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish", "integer", 0)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "integer", 0);//组货深度; | |
} | |
var LookProducts = weekNode.LookProducts; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, false, 1); | |
} | |
//重新加载页面 | |
window.location.reload(); | |
return true; | |
}, | |
//国内组货取消 | |
C8_GuoNeiCancellConfirm:function(ac){ | |
var weekURL = ac.m_urlParent; | |
var currentNode = routerStore.locationNode; | |
var weekNode = getNode(ac,weekURL); | |
let sameMeg = checkSameMLIsZHing(ac,weekURL); | |
if (sameMeg) { | |
jp.alert(sameMeg); | |
return sameMeg; | |
} | |
ac.m_writer.changeNode(weekURL).changeAttribute("C8_ML_Status","enum","UR_ZHStatus:Start"); | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.widget.refreshData(); | |
} | |
var mentions = getGroup(ac, "海外买手"); | |
var mentions1 = getGroup(ac, "电商买手"); | |
mentions.concat(mentions1); | |
var subject = "组货取消消息";//主题 | |
var comments = currentNode.$Name + "的" + weekNode.$Name + "组货已取消";//消息文本 | |
var monthNode = getNode(ac,weekNode.PrimaryCollection); | |
var docContainer = monthNode.DocumentsAndComments; | |
createConversation(ac, docContainer, subject, mentions, comments); | |
//发送邮件 | |
SendMailToRole(ac,"海外买手","测试:" + subject,comments,""); | |
SendMailToRole(ac,"电商买手","测试:" + subject,comments,""); | |
var LookProducts = weekNode.LookProducts; | |
for(var i =0;i<LookProducts.length;i++){ | |
var lookProductNode = getNode(ac,LookProducts[i]); | |
var skcNode = getNode(ac,lookProductNode.C8_MCP_SKC); | |
ac.m_writer.changeNode(skcNode.$URL).changeAttribute("C8_CW_GNDepth","integer","0"); | |
ac.m_writer.changeNode(skcNode.$URL).changeAttribute("C8_CW_GNSelected","boolean",false); | |
//清空确认唯一码以及组货单号字段 | |
// ac.m_writer.changeNode(skcNode.$URL).changeAttribute("UR_Colorway_OKCode","string",""); | |
// ac.m_writer.changeNode(skcNode.$URL).changeAttribute("UR_CW_GroupBillNo","ref","centric:"); | |
// this.C8_CancellConfirmCleanData(ac, lookProductNode); | |
//0530 Jarvis 渠道款设置编辑 | |
var styleNode = getNode(ac,skcNode.__Parent__); | |
ac.m_writer.changeNode(styleNode.$URL).changeAttributeFlag("UR_Style_KNSStyle", xml.ATTR_FLAG_NOEDIT, false,true); | |
ac.m_writer.changeNode(styleNode.Attributes).changeAttributeFlag("UR_StyleAttributes_GroupCarPrice", xml.ATTR_FLAG_NOEDIT, false,true); | |
} | |
// ac.m_writer.execute({sync: true}); | |
//设置周目标上的组货结果重置为0 | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL); | |
//.Attr("UR_MCMC_Control", xml.OP_EQUALS, true);不止更新强管控目标 | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
for(var i=0; i<results.length; i++){ | |
var mcmc = results[i]; | |
ac.m_writer.changeNode(mcmc.$URL).changeAttribute("C8_MCMC_GroupGoodsAmountFinish", "double", 0)//组货金额 | |
.changeAttribute("C8_MCMC_DAmountFinish", "double", 0)//D款大片款超出金额 | |
.changeAttribute("C8_MCMC_GroupGoodsSKCFinish", "integer", 0)//组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsAvgPriceFinish", "double", 0)//组货深度平均价 | |
.changeAttribute("C8_MCMC_GroupGoodsStyleDepthFinish", "integer", 0)//款组货宽度 | |
.changeAttribute("C8_MCMC_GroupGoodsDepthFinish", "integer", 0);//组货深度; | |
} | |
var groupOrderAattribute = null; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
weekURL = currentNode.$URL; | |
weekNode = getNode(ac, currentNode.$URL); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.__Parent__).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.__Parent__); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.viewParent.refreshData(); | |
}else if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
ac.m_writer.changeNode(weekURL).changeAttribute("UR_ML_Send_Ready_Flag","boolean","true"); | |
ac.m_writer.changeNode(currentNode.$URL).changeAttribute("UR_MC_Send_Ready_Flag","boolean","true"); | |
var mcNode = getNode(ac,currentNode.$URL); | |
groupOrderAattribute = mcNode.C8_MC_MonthOrderAattribute; | |
ac.widget.refreshData(); | |
} | |
var LookProducts = weekNode.LookProducts; | |
for (var i = 0; i < LookProducts.length; i++) { | |
var lookProductNode = getNode(ac, LookProducts[i]); | |
updateURStyleAttributesGroupBillNo(ac, lookProductNode, groupOrderAattribute, currentNode, weekNode.C8_ML_Week, false, 0); | |
} | |
//重新加载页面 | |
window.location.reload(); | |
return true; | |
}, | |
//控制是否可以锁定组货 | |
C8_LockWeekAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
if(contextNode && contextNode.$Type=="MarketingLook"){ | |
var weekStatus = contextNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
if(weekStatusValue!="Lock" && weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
return hasAccess; | |
}, | |
//组货计算按钮的权限控制,只要未完成都能访问 | |
C8_GuoNeiCalculateAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
//新增判断只允许在月下组货 | |
var locationNode = routerStore.locationNode; | |
if(locationNode && locationNode.$Type=="MarketingCollection" && contextNode && contextNode.$Type=="MarketingLook"){ | |
var weekStatus = contextNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
//非计划单不控制按单号顺序组货确认 | |
if(weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
return hasAccess; | |
}, | |
//组货计算,完成后不需要计算 | |
C8_GuoNeiConfirmAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
if(contextNode && contextNode.$Type=="MarketingLook"){ | |
var mcNode = ctx.cache.getNode(contextNode.__Parent__); | |
//非计划单不控制按单号顺序组货确认 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute != "UR_enum_OrderAattribute:N"){ | |
hasAccess=true; | |
} | |
var weekStatus = contextNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
//如果当前是第1单,未完成状态才能点击 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && contextURL == mcNode.C8_MC_Week1){ | |
if(weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
//如果当前是第2单,需要第1单已经完成 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && contextURL == mcNode.C8_MC_Week2){ | |
var weekPre = ctx.cache.getNode(mcNode.C8_MC_Week1); | |
if(weekPre){ | |
var weekPreStatus = getEnumValue(weekPre.C8_ML_Status); | |
if(weekPreStatus == "Complete" && weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
} | |
//第3单 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && contextURL == mcNode.C8_MC_Week3){ | |
var weekPre = ctx.cache.getNode(mcNode.C8_MC_Week2); | |
if(weekPre){ | |
var weekPreStatus = getEnumValue(weekPre.C8_ML_Status); | |
if(weekPreStatus == "Complete" && weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
} | |
//第4单,需要第3单已完成 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && contextURL == mcNode.C8_MC_Week4){ | |
var weekPre = ctx.cache.getNode(mcNode.C8_MC_Week3); | |
if(weekPre){ | |
var weekPreStatus = getEnumValue(weekPre.C8_ML_Status); | |
if(weekPreStatus == "Complete" && weekStatusValue!="Complete" ){ | |
hasAccess = true; | |
} | |
} | |
} | |
//第5单,需要第4单已完成 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && contextURL == mcNode.C8_MC_Week5){ | |
var weekPre = ctx.cache.getNode(mcNode.C8_MC_Week4); | |
if(weekPre){ | |
var weekPreStatus = getEnumValue(weekPre.C8_ML_Status); | |
if(weekPreStatus == "Complete" && weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
} | |
//第6单 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && contextURL == mcNode.C8_MC_Week6){ | |
var weekPre = ctx.cache.getNode(mcNode.C8_MC_Week5); | |
if(weekPre){ | |
var weekPreStatus = getEnumValue(weekPre.C8_ML_Status); | |
if(weekPreStatus == "Complete" && weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
} | |
} | |
return hasAccess; | |
}, | |
//组货计算,非计划单不控制顺序,计划单非末单不控制顺序,末单需要前面的单都完成 | |
C8_GuoNeiConfirmAccessActionV2: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
//新增判断只允许在月下组货 | |
var locationNode = routerStore.locationNode; | |
if(locationNode && locationNode.$Type=="MarketingCollection" && contextNode && contextNode.$Type=="MarketingLook"){ | |
var mcNode = ctx.cache.getNode(contextNode.__Parent__); | |
var weekStatus = contextNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
//非计划单不控制按单号顺序组货确认 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute != "UR_enum_OrderAattribute:N"){ | |
if(weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
var isLast = contextNode.UR_ML_IsLastOrder; | |
//计划单如果非末单不控制顺序 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && !isLast){ | |
if(weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
//计划单最后一单 | |
if(mcNode && mcNode.C8_MC_MonthOrderAattribute == "UR_enum_OrderAattribute:N" && isLast){ | |
var allWeeks = mcNode.C8_MC_Week; | |
var currentKey = getEnumValue(contextNode.C8_ML_Week); | |
hasAccess = true; | |
Object.keys(allWeeks).forEach(function(key){ | |
if(currentKey != key){ | |
var weekPre = ctx.cache.getNode(allWeeks[key]); | |
var weekPreStatus = getEnumValue(weekPre.C8_ML_Status); | |
if(weekPreStatus != "Complete" || weekStatusValue == "Complete"){ | |
hasAccess = false; | |
return; | |
} | |
} | |
} ); | |
} | |
} | |
return hasAccess; | |
}, | |
//取消组货确认按钮控制 | |
C8_HWConfirmAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
if(contextNode && contextNode.$Type=="MarketingLook"){ | |
var weekStatus = contextNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
if(weekStatusValue!="Complete"){ | |
hasAccess = true; | |
} | |
} | |
return hasAccess; | |
}, | |
//取消组货确认按钮控制 | |
C8_CancellConfirmAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
if(contextNode && contextNode.$Type=="MarketingLook"){ | |
var weekStatus = contextNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
if(weekStatusValue=="Complete"){ | |
hasAccess = true; | |
} | |
} | |
return hasAccess; | |
}, | |
//控制是否可以解锁组货 | |
C8_UnLockWeekAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var contextURL = ctx.view.urlRoot; | |
var contextNode = ctx.cache.getNode(contextURL); | |
var hasAccess = false; | |
if(contextNode && contextNode.$Type=="MarketingLook"){ | |
var weekStatus = contextNode.C8_ML_Status; | |
var weekStatusValue = getEnumValue(weekStatus); | |
if(weekStatusValue=="Lock"){ | |
hasAccess = true; | |
} | |
} | |
return hasAccess; | |
}, | |
//海外组货新建SKC控制权限 | |
C8_NewMCPFromColorwayAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var currentNode = routerStore.locationNode; | |
var hasAccess = false; | |
if(currentNode && currentNode.$Type=="MarketingLook"){ | |
hasAccess = true; | |
} | |
return hasAccess; | |
}, | |
//海外组货新建SKC控制权限 | |
C8_NewMCPFromColorwayMonthAccessAction: function(/*Context*/ctx, /*Action*/action) { | |
var currentNode = routerStore.locationNode; | |
var hasAccess = false; | |
if(currentNode && currentNode.$Type=="MarketingCollection"){ | |
hasAccess = true; | |
} | |
return hasAccess; | |
}, | |
//国际版型导入 | |
C8_ImportStyle:function(ac){ | |
var otherParam = {"url":ac.m_urlParent}; | |
var title = "海外定深导入" | |
var url = "Site/html/hwImportZB.html?"; | |
url = url + "downlink=" + encodeURI("/国际转版导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=MCProductImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
return true; | |
}, | |
//国内定深导入 Jarvis | |
C8_ImportMcProduct:function(ac){ | |
var otherParam = {}; | |
var title = "定深导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/国内定深导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=MCProductImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//电商定深导入 | |
C8_ImportMcProductDS:function(ac){ | |
var otherParam = {}; | |
var title = "电商定深导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/电商定深导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=DSProductImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//导入SKC标准及LOOK套数的标准值&组货系数 Jarvis | |
C8_ImportSpecItems1:function(ac){ | |
//var nodeUrl = ac.m_cache.addNode(ac.m_urlParent).__Parent__; | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:1"}; | |
var title = "SKC标准及LOOK套数的标准值导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/SKC标准及LOOK套数的标准值模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//主题款模块SKC数限制配置表导入 Jarvis | |
C8_ImportSpecItems2:function(ac){ | |
//var nodeUrl = ac.m_cache.addNode(ac.m_urlParent).__Parent__; | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:2"}; | |
var title = "主题款模块SKC数限制配置表导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/主题款模块SKC数限制配置表模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//特殊款最低深度设置表导入 Jarvis | |
C8_ImportSpecItems3:function(ac){ | |
//var nodeUrl = ac.m_cache.addNode(ac.m_urlParent).__Parent__; | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:3"}; | |
var title = "特殊款最低深度设置表导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/特殊款最低深度设置表模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//D大片款可超金额导入 Jarvis | |
C8_ImportSpecItems4:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:4"}; | |
var title = "D大片款可超金额上限导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/D大片款可超金额上限模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//单店深度标准(MIP)导入 Jarvis | |
C8_ImportSpecItems5:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:5"}; | |
var title = "单店深度标准(MIP)导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/单店深度标准(MIP)模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//南北款店铺数(MIP)导入 Jarvis | |
C8_ImportSpecItems6:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:6"}; | |
var title = "南北款店铺数(MIP)导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/南北款店铺数(MIP)模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//组货金额、宽度、平均单价检核参数导入 Jarvis | |
C8_ImportSpecItems7:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:7"}; | |
var title = "组货金额、宽度、平均单价检核参数导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/组货金额、宽度、平均单价检核参数模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//可增减SKC数规则导入 Jarvis | |
C8_ImportSpecItems8:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:8"}; | |
var title = "可增减SKC数规则导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/可增减SKC数规则模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//价格段定义导入 Jarvis | |
C8_ImportSpecItems9:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:9"}; | |
var title = "价格段定义导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/价格段定义模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//非特殊款最低深度导入 Jarvis | |
C8_ImportSpecItemsL:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:L"}; | |
var title = "非特殊款最低深度导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/非特殊款最低深度模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//单月全国覆盖最低深度(MIP)导入 Jarvis | |
C8_ImportSpecItemsJ:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:J"}; | |
var title = "单月全国覆盖最低深度(MIP)导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/单月全国覆盖最低深度(MIP)模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//组货系数导入 Jarvis | |
C8_ImportSpecItemsI:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:I"}; | |
var title = "组货系数导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/组货系数模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//月度企划结构表导入 Jarvis | |
C8_ImportSpecItemsC:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:C"}; | |
var title = "月度企划结构表导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/月度企划结构表导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//组货金额、宽度、平均单价检核参数导入 Jarvis | |
C8_ImportSpecItemsB:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:B"}; | |
var title = "组货金额、宽度、平均单价检核参数导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/组货金额、宽度、平均单价检核参数导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//D款深度配置表导入 Jarvis | |
C8_ImportSpecItemsK:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:K"}; | |
var title = "D款深度配置表导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/D款深度配置表导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//单号组货SKC数合理范围配置表导入 Jarvis | |
C8_ImportSpecItemsA:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:A"}; | |
var title = "单号组货SKC数合理范围配置表导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/单号组货SKC数合理范围配置表导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//普通款深度导入 Jarvis | |
C8_ImportSpecItemsX:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:X"}; | |
var title = "普通款深度导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/普通款深度导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//D款深度配置表导入 Jarvis | |
C8_ImportSpecItemsK:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:K"}; | |
var title = "D款深度配置表导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/D款深度配置表导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//等级系数导入 Jarvis | |
C8_ImportSpecItemsE:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:E"}; | |
var title = "等级系数导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/等级系数导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//月度单号占比导入 Jarvis | |
C8_ImportSpecItemsF:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:F"}; | |
var title = "月度单号占比导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/月度单号占比导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//组货金额、宽度、平均单价、平均深度检核参数导入 Jarvis | |
C8_ImportSpecItemsG:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:G"}; | |
var title = "组货金额、宽度、平均单价、平均深度检核参数导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/组货金额、宽度、平均单价、平均深度检核参数导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//最低深度导入 Jarvis | |
C8_ImportSpecItemsD:function(ac){ | |
var otherParam = {"UR_SDS_Parent":ac.m_urlParent,"UR_SDS_TableRule":"UR_Rule:D"}; | |
var title = "最低深度导入" | |
var url = "Site/html/import.html?"; | |
url = url + "downlink=" + encodeURI("/最低深度导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=SpecDataSheetItemImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//临时创建月目标的按钮,用于测试时手工创建数据用 | |
C8_CreateMonthTarget:function(ac){ | |
var monthUrl = ac.m_urlParent; | |
var newMT = comm.createUrl(); | |
ac.m_writer.createNode(newMT, "MCMaterial").changeAttribute("__Parent__","ref",monthUrl).attach(monthUrl, "Materials"); | |
var monthNode = getNode(ac,monthUrl); | |
if(monthNode && monthNode.$Type=="MarketingCollection"){ | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MarketingLook") | |
.RefAttr("PrimaryCollection", xml.OP_EQUALS, monthUrl); | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if(results){ | |
results.forEach(function(mlNode){ | |
var newWT = comm.createUrl(); | |
var mlURL = mlNode.$URL; | |
ac.m_writer.createNode(newWT, "MCMaterialColor").changeAttribute("__Parent__","ref",newMT).changeAttribute("C8_MCMC_Week","ref",mlURL).attach(newMT, "Colors"); | |
}); | |
} | |
} | |
return true; | |
}, | |
//临时创建周目标的按钮,用于测试时手工创建数据用 | |
C8_CreateWeekTarget:function(ac){ | |
var weekURL = ac.m_urlParent; | |
var newWT = comm.createUrl(); | |
ac.m_writer.createNode(newWT, "MCMaterialColor").changeAttribute("__Parent__","ref",weekURL).attach(weekURL, "Colors"); | |
return true; | |
}, | |
//海外深度导入 | |
C8_hwExport:function(ac){ | |
var otherParam = {"importUrl":ac.m_urlParent}; | |
var title = "海外定深导入" | |
var url = "Site/html/hwImport.html?"; | |
url = url + "downlink=" + encodeURI("/海外定深导入模板.xlsx");//下载的文件名 | |
url = url + "&importName=MCProductImport&otherParam=" + encodeURIComponent(JSON.stringify(otherParam)) + "";//访问的requestMap | |
jp.openImport(title, url, ac.widget); | |
return true; | |
}, | |
//海外店群计算逻辑 | |
C8_storeDate:function (ac){ | |
var weekNode = routerStore.locationNode; | |
if(weekNode.$Type == "MarketingCollection"){ | |
//通过mcproduct查询出当前单号 | |
var productUrl = ac.m_urlParent; | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MarketingLook") | |
.RefAttr("LookProducts", xml.OP_EQUALS, productUrl); | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if(results.length > 0){ | |
weekNode = getNode(ac,results[0].$URL); | |
}else{ | |
jp.alert("通过MCProduct查询不到单号!"); | |
return true; | |
} | |
} | |
if(weekNode.C8_ML_Status == "UR_ZHStatus:Complete"){ | |
jp.alert("组货已完成,不能再次计算数据!"); | |
return true; | |
} | |
var loadingMessage = "数据处理中,请稍等....."; | |
var loading = jp.loading(loadingMessage); | |
var node = getNode(ac,ac.m_urlParent); | |
var styleAttrNode = ac.m_cache.getPathNode(node, "Child:C8_MCP_SKC/Child:__Parent__/Child:Attributes", true); | |
var styleNode = ac.m_cache.getPathNode(node, "Child:C8_MCP_SKC/Child:__Parent__", true); | |
var skcNode = ac.m_cache.getPathNode(node, "Child:C8_MCP_SKC", true); | |
if(styleNode == undefined){ | |
jp.alert("请先选择SKC后再操作!"); | |
return true; | |
} | |
var midCatType = styleAttrNode.UR_StyleAttributes_MiddleCategoryTypeCount; | |
var largeType = ""; | |
//if(midCatType == "UR_enum_ProductMiddleType:"){ | |
largeType = getNode(ac,styleNode.Collection).UR_Collection_ProductLargeType;//中品为空就取产品品类 | |
//} | |
var series = styleAttrNode.UR_StyleAttributes_OriginalSeries; | |
var locationNode = routerStore.locationNode; | |
var monthNode = ""; | |
if(locationNode.PrimaryCollection) { | |
monthNode = getNode(ac, locationNode.PrimaryCollection); | |
} | |
if(locationNode.$Type == "MarketingCollection"){ | |
monthNode = locationNode; | |
} | |
//1.获取规则表 | |
var ruleTableNode = searchRuleTable(monthNode); | |
var tableRuleS = filterRuleTable(ruleTableNode,"E",false,{UR_SDS_SubProductSeriation:series}); | |
var tableRuleD = filterRuleTable(ruleTableNode,"D",false,{UR_SDS_SubProductSeriation:series}); | |
if(tableRuleS.length == 0){ | |
jp.alert("数据在等级系数表中没找到相应规则!请先查看等级系数中子系列对应的产品等级!"); | |
return true; | |
} | |
if(tableRuleD.length > 0){//设置最低深度 | |
var levelList = Object.entries(node.C8_MCP_StoreLevel); | |
for (var t = 0; t < levelList.length; t++) { | |
var depthmap = new Map(); | |
for (var q = 0; q < tableRuleD.length; q++) { | |
var tableRuleD1 = tableRuleD[q]; | |
depthmap[levelList[t][0]] = tableRuleD1.UR_SDS_LowDepth; | |
//var customer = tableRuleD1.UR_SDS_Customer; | |
//depthmap[customer] = tableRuleD1.UR_SDS_LowDepth; | |
if(monthNode.C8_MCM_ProductLargeType == tableRuleD1.UR_SDS_ProductLargeType) | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_SpecialLowDepthHy", "integermap", depthmap, true, false); | |
} | |
} | |
} | |
//查询MCMaterialColor 企划金额 | |
var weekNode = getNode(ac,weekNode.$URL); | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL); | |
if(midCatType == "UR_enum_ProductMiddleType:"){ | |
q.Attr("C8_MCM_ProductLargeType",xml.OP_EQUALS,largeType,"Child:__Parent__"); | |
}else{ | |
q.Attr("C8_MCM_CategoryInPlan",xml.OP_EQUALS,midCatType,"Child:__Parent__"); | |
} | |
var dependcyPath = ["Child:__Parent__"]; | |
search = search.addDependencyPaths(dependcyPath); | |
var res = search.execute({ sync: true }); | |
var result = res.getResultNodes(); | |
//20240314新增逻辑,如果查询不到结果,则通过品类查询,品类在目标上一定有 吉吉确认 Jarvis | |
if(result.length == 0){ | |
var search1 = new Search(); | |
var q1 = search1.getQuery(); | |
q1.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterialColor") | |
.RefAttr("C8_MCMC_Week", xml.OP_EQUALS, weekNode.$URL) | |
.Attr("C8_MCM_ProductLargeType",xml.OP_EQUALS,largeType,"Child:__Parent__"); | |
var res1 = search1.execute({ sync: true }); | |
var result1 = res1.getResultNodes(); | |
result = result1; | |
} | |
if(result.length > 0) { | |
for (var j = 0; j < result.length; j++) { | |
for (var w = 0; w < tableRuleS.length; w++) { | |
var tableRuleS1 = tableRuleS[w]; | |
var levelList = Object.entries(node.C8_MCP_StoreLevel); | |
var priceStr = getEnumValue(styleAttrNode.UR_StyleAttributes_GroupCarPrice); //组货单价 | |
var price = 0; | |
if (priceStr && priceStr != "") { | |
priceStr = priceStr.trim(); | |
price = parseInt(priceStr); | |
} | |
if (price == 0) { | |
jp.alert("组货单价不能为0,请检查数据!"); | |
return true; | |
} | |
var map = new Map(); | |
var tzMap = new Map(); | |
for (var t = 0; t < levelList.length; t++) { | |
var mcmaterialNode = getNode(ac,result[j].__Parent__); | |
if(levelList[t][0] != mcmaterialNode.C8_MCM_Store){ | |
continue; | |
} | |
var sdmap = new Map(); | |
var skcLockhy = node.C8_MCP_SKCLockhy; | |
if (tableRuleS1.UR_SDS_ProductLevel == levelList[t][1]) { | |
sdmap[levelList[t][0]] = tableRuleS1.UR_SDS_ProductLevelRate; | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_StoreLevelCoefficient", "doublemap", sdmap, true, false); | |
var rate = tableRuleS1.UR_SDS_ProductLevelRate; | |
var amount = 0; | |
if ((mcmaterialNode.C8_MCM_PlannedSKC * rate) > 0) { | |
amount = mcmaterialNode.C8_MCM_PlannedAmount / mcmaterialNode.C8_MCM_PlannedSKC * rate; | |
} | |
var volumn = amount / price; | |
volumn = parseInt(volumn); | |
node = ac.m_cache.addNode(node.$URL); | |
var tableRuleDV = filterRuleTable(ruleTableNode,"D",true,{UR_SDS_SubProductSeriation:series,UR_SDS_ProductLargeType:styleAttrNode.UR_StyleAttributes_ProductLargeType}); | |
var admap = new Map(); | |
if(volumn < tableRuleDV.UR_SDS_LowDepth && levelList[t][1] != "UR_ProductLevel:N"){// N代表不组货不修改默认为最低深度 | |
volumn = tableRuleDV.UR_SDS_LowDepth; | |
} | |
var advolumn = volumn * price;//调整金额 | |
map[levelList[t][0]] = volumn; | |
if(skcLockhy[levelList[t][0]] != undefined){ | |
if(!skcLockhy[levelList[t][0]]){ | |
tzMap[levelList[t][0]] = volumn; | |
} | |
}else{ | |
tzMap[levelList[t][0]] = volumn; | |
} | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_StoreVolumn", "integermap", map, true, false); | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_AdjustingDepthHy", "integermap", tzMap, true, false); | |
var sumap = new Map(); | |
var suvolumn = volumn * price;//建议金额 | |
sumap[levelList[t][0]] = suvolumn; | |
if(skcLockhy[levelList[t][0]] != undefined){ | |
if(!skcLockhy[levelList[t][0]]){ | |
admap[levelList[t][0]] = suvolumn; | |
} | |
}else{ | |
admap[levelList[t][0]] = suvolumn; | |
} | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_SuggestedAmountHy", "doublemap", sumap, true, false); | |
ac.m_writer.changeNode(node.$URL).changeAttribute("C8_MCP_AdjustingAmountHy", "doublemap", admap, true, false); | |
} | |
} | |
} | |
} | |
}else{ | |
jp.alert("在规则表中没获取到数据,请检查数据!"); | |
return true; | |
} | |
ac.m_writer.execute({sync: true}); | |
ac.bRefreshNode = true; | |
ac.widget.refreshData(); | |
jp.close(loading); | |
jp.alert("数据计算完成!"); | |
return true; | |
}, | |
ShowTargetView:function(ac){ | |
var actionName = ac.m_action.m_name; | |
var newActionName = ""; | |
var divStyle = ""; | |
if(actionName=="隐藏周目标"){ | |
newActionName = "显示周目标"; | |
divStyle = "display:none"; | |
}else{ | |
newActionName = "隐藏周目标"; | |
divStyle = ""; | |
} | |
ac.m_action.m_name = newActionName; | |
$("div[class*='csi-view-MarketingLook-C8GNZuHuo']").find("div[data-csi-template-rule='Rule1']").each(function(){$(this).attr("style",divStyle);}); | |
$("span:contains('"+actionName+"')[data-dojo-attach-point='containerNode']").each(function(){$(this).html(newActionName)}); | |
ac.widget._resizeView(); | |
}, | |
//移除海外选款 Jarvis 20240428 | |
C8_HWDelete:function (ac){ | |
var mcpUrl = ac.m_urlNode; | |
var mcpNode = getNode(ac,mcpUrl); | |
ac.m_writer.changeNode(mcpNode.C8_MCP_SKC).changeAttribute("C8_CW_HWPick","boolean",false); | |
return true; | |
}, | |
//移除国内选款 Jarvis 20240618 | |
C8_GNDelete:function (ac){ | |
var mcpUrl = ac.m_urlNode; | |
var mcpNode = getNode(ac,mcpUrl); | |
ac.m_writer.changeNode(mcpNode.C8_MCP_SKC).changeAttribute("C8_CW_GNPick","boolean",false); | |
return true; | |
}, | |
//移除电商选款 Jarvis 20240618 | |
C8_DSDelete:function (ac){ | |
var mcpUrl = ac.m_urlNode; | |
var mcpNode = getNode(ac,mcpUrl); | |
ac.m_writer.changeNode(mcpNode.C8_MCP_SKC).changeAttribute("C8_CW_DSPick","boolean",false); | |
return true; | |
}, | |
//刷新WESTV深度 | |
C8_FlushAvgD:function (ac){ | |
var mcURL = ac.m_urlParent; | |
var mcNode = getNode(ac,mcURL); | |
if(mcNode.Products.length >0 && mcNode.Materials.length >0){ | |
mcNode.Products.forEach(function(url,index){ | |
var nodeObj = getNode(ac,url); | |
if(nodeObj && nodeObj.$Type == "MCProduct"){ | |
if(nodeObj.C8_MCP_SKC == "centric:"){ | |
return; | |
} | |
var skcObj = getNode(ac,nodeObj.C8_MCP_SKC); | |
var styleNode = getNode(ac,skcObj.__Parent__); | |
var styleAttrNode = getNode(ac,styleNode.Attributes); | |
var search = new Search(); | |
var q = search.getQuery(); | |
//查询当前MC下的第一个商品层、大类、中类与款式相同的月目标 | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterial") | |
.RefAttr("__Parent__", xml.OP_EQUALS, mcURL) | |
.Attr("C8_MCM_CommodityType", xml.OP_EQUALS, styleNode.UR_Style_CommodityType) | |
.Attr("C8_MCM_ProductLargeType", xml.OP_EQUALS, styleNode.UR_Style_ProductLargeType) | |
.Attr("C8_MCM_CategoryInPlan", xml.OP_EQUALS, styleAttrNode.UR_StyleAttributes_MiddleCategoryType) | |
var res = search.execute({sync: true}); | |
var results = res.getResultNodes(); | |
if (results.length > 0) { | |
var mcMaterialNode = results[0]; | |
ac.m_writer.changeNode(styleNode.$URL).changeAttribute("UR_Style_MonthAvgDepth","integer",Math.round(mcMaterialNode.C8_MCM_MonthAvgDepth)); | |
}else{ | |
var search2 = new Search(); | |
var q2 = search2.getQuery(); | |
//查询当前MC下的第一个商品层、大类与款式相同的月目标 | |
q2.Node(xml.PROP_TYPE, xml.OP_EQUALS, "MCMaterial") | |
.RefAttr("__Parent__", xml.OP_EQUALS, mcURL) | |
.Attr("C8_MCM_CommodityType", xml.OP_EQUALS, styleNode.UR_Style_CommodityType) | |
.Attr("C8_MCM_ProductLargeType", xml.OP_EQUALS, styleNode.UR_Style_ProductLargeType); | |
res = search2.execute({sync: true}); | |
results = res.getResultNodes(); | |
if(results.length > 0){ | |
var mcMaterialNode = results[0]; | |
ac.m_writer.changeNode(styleNode.$URL).changeAttribute("UR_Style_MonthAvgDepth","integer",Math.round(mcMaterialNode.C8_MCM_MonthAvgDepth)); | |
}else{ | |
ac.m_writer.changeNode(styleNode.$URL).changeAttribute("UR_Style_MonthAvgDepth","integer",0); | |
} | |
} | |
} | |
}); | |
} | |
ac.widget.refreshData(); | |
return true; | |
}, | |
//创建规则表后自动创建Section | |
/* | |
PostCreateSDCreateSection:function(ac){ | |
var sdUrl = ac.m_urlNode; | |
var sdNode = ac.m_cache._data[ac.m_urlNode]; | |
var subType = sdNode.Subtype; | |
var search = new Search(); | |
var q = search.getQuery(); | |
q.Node(xml.PROP_TYPE, xml.OP_EQUALS, "SpecificationSectionDefinition") | |
.RefAttr("Subtype", xml.OP_EQUALS,subType) | |
.Attr("Special",xml.OP_EQUALS,"false") | |
.Attr("Active",xml.OP_EQUALS,"true"); | |
var res = search.execute({ sync: true }); | |
var result = res.getResultNodes(); | |
if(result.length > 0){ | |
var sectionDefUrl = result[0].$URL; | |
var newUrl = comm.createUrl(); | |
ac.m_writer.callMethod("SpecificationDataSheet", "CreateSpecificationSection") | |
.addParameter("Special", "boolean", true) | |
.addParameter("URL", "ref", newUrl) | |
.addParameter("ParentURL", "ref", docContainer) | |
.addParameter("ParentAttr", "string", "AllSections") | |
.addParameter("Add", "boolean", true) | |
.addParameter("FromURL", "ref", sectionDefUrl); | |
ac.m_writer.execute({sync:true}); | |
} | |
},*/ | |
}; | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment