Commit 0cf4b358 by chenjinjing

no message

parent a190c046
{
"1730359573927": {},
"1729153582461": {},
"1730359559228": {
"isSubmit": false,
"R": [],
"I": [
{
"xsid": "C030",
"xsnr": "工人辛 - 产量1650",
"isChoice": false
},
{
"xsid": "C033",
"xsnr": "画师3 - 产量1900",
"isChoice": false
},
{
"xsid": "C035",
"xsnr": "掌柜B - 产量1100",
"isChoice": false
}
]
}
}
\ No newline at end of file
{ {
{ {
"1727399696222": { "1730359573927": {},
"SWOT": { "1729153582461": {},
"isSubmit": false, "1730359559228": {
"S": [ "isSubmit": false,
{ "S": [
"xsid": "C028", {
"xsnr": "测试线索1", "xsid": "C014",
"isChoice": false "xsnr": "熟悉整套生产运输流程",
}, "isChoice": false
{ },
"xsid": "C029", {
"xsnr": "测试线索2", "xsid": "C015",
"isChoice": false "xsnr": "还有熟识的好友可以提供协助",
} "isChoice": false
], },
"W": [], {
"O": [ "xsid": "C016",
{ "xsnr": "流行的瓷器粗制滥造,市场难觅好的瓷器",
"xsid": "C030", "isChoice": false
"xsnr": "测试线索3", },
"isChoice": false {
}, "xsid": "C017",
{ "xsnr": "资金匮乏",
"xsid": "C031", "isChoice": false
"xsnr": "测试线索4", },
"isChoice": false {
} "xsid": "C018",
], "xsnr": "商人可选择带回国做贸易的商品众多",
"T": [] "isChoice": false
}, }
"ROI": { ],
"isSubmit": false, "W": [],
"R": [], "O": [
"I": [] {
}, "xsid": "C019",
"竞合": { "xsnr": "虽然流行的瓷器品质一般,但数量众多",
"isSubmit": false, "isChoice": false
"供应商": [], }
"行业竞争": [], ],
"跨界竞争": [], "T": []
"潜在替代": [],
"消费者": []
}
} }
} }
\ No newline at end of file
{ {
...@@ -2,6 +2,90 @@ ...@@ -2,6 +2,90 @@
"1727399696222": { "1727399696222": {
"初始资金": 500, "初始资金": 500,
"天数": 1, "天数": 1,
"结算": 500 "结算": 500,
"广州府介绍": true,
"酒馆剧情": 0,
"当前线索确认": 0,
"商行选择": false,
"SWOT": false,
"ROI": false,
"竞合": false
},
"1730359559228": {
"初始资金": 500,
"天数": 4,
"结算": -214000,
"广州府介绍": false,
"酒馆剧情": 1,
"当前线索确认": 1,
"商行选择": true,
"SWOT": true,
"ROI": true,
"竞合": true,
"码头": {
"SO11": {
"当前对话id": "15",
"已获得的线索": [
"C001",
"C002",
"C003",
"C012"
]
}
},
"酒馆": {
"SO12_1": {
"当前对话id": "15",
"已获得的线索": []
}
}
},
"1729153582461": {
"初始资金": 500,
"天数": 3,
"结算": 500,
"广州府介绍": false,
"酒馆剧情": 0,
"当前线索确认": 0,
"商行选择": false,
"SWOT": false,
"ROI": false,
"竞合": false
},
"1730359573927": {
"初始资金": 500,
"天数": 2,
"结算": 500,
"广州府介绍": false,
"酒馆剧情": 0,
"当前线索确认": 0,
"商行选择": false,
"SWOT": false,
"ROI": false,
"竞合": false
},
"1730970187744": {
"初始资金": 500,
"天数": 1,
"结算": 500,
"广州府介绍": false,
"酒馆剧情": 0,
"当前线索确认": 0,
"商行选择": false,
"SWOT": false,
"ROI": false,
"竞合": false
},
"1730970810891": {
"初始资金": 500,
"天数": 0,
"结算": 500,
"广州府介绍": true,
"酒馆剧情": 0,
"当前线索确认": 0,
"商行选择": false,
"SWOT": false,
"ROI": false,
"竞合": false
} }
} }
\ No newline at end of file
{ ++ /dev/null
{
"1727399696222": {
"SWOT": {
"isSubmit": false,
"S": [],
"W": [],
"O": [],
"T": []
},
"ROI": {
"isSubmit": true,
"R": [],
"I": []
},
"竞合": {
"isSubmit": false,
"供应商": [],
"行业竞争": [],
"跨界竞争": [],
"潜在替代": [],
"消费者": []
}
}
}
\ No newline at end of file
{
{
"js":"十三行[Shísānháng]历史地名。位于广州市荔湾区沙面与文化公园的北面。清康熙二十五(1686),广州城西南江边开设洋货行,又称十三行。据谭元亨《十三行史稿》考证,“广州十三行与早先月港的,职能’一脉相承”。作者认为“十三行”一词缘起明代的月港:涵盖经营珠宝、棉布瓷器、丝绸、箍(豆饼)、铸鼎、糖、丝线、鱼、纸、茶、造船等13种行业。“十三行”是专称一个行业、一种职能,即明清对外贸易特有的机制与行当,其意义超越地域名、商馆数之名、资本集团之名以及制度名,而是历史之名,是传统的延续。 [13]十三只为特指数,不确实是十区。清乾隆二十二年(1757)-清道光二十二方允许的。"
}
\ No newline at end of file
{ ++ /dev/null
{
"掌柜":{},
"工人":{},
"画师":{}
}
\ No newline at end of file
{
{
"1727399696222": {
"SWOT": 0,
"ROI": 0,
"竞合": 0
},
"1729153582461": {
"SWOT": 0,
"ROI": 0,
"竞合": 0
},
"1730359559228": {
"SWOT": 14.285714285714285,
"ROI": 30,
"竞合": 17.77777777777778
},
"1730359573927": {},
"1730970187744": {
"SWOT": 0,
"ROI": 0,
"竞合": 0
},
"1730970810891": {
"SWOT": 0,
"ROI": 0,
"竞合": 0
}
}
\ No newline at end of file
{
{
"瓷器": {
"定制精美瓷器": {
"瓷器": "C040",
"颜料": "C038",
"单价": 300,
"固定成本": 200
},
"定制普通瓷器": {
"瓷器": "C040",
"颜料": "C039",
"单价": 270,
"固定成本": 190
},
"通用精美瓷器": {
"瓷器": "C041",
"颜料": "C038",
"单价": 170,
"固定成本": 120
},
"通用普通瓷器": {
"瓷器": "C041",
"颜料": "C039",
"单价": 150,
"固定成本": 110
}
},
"人员成本": {
"C023": {
"ycl": 360,
"gz": 150,
"fjcb": 0.42
},
"C024": {
"ycl": 450,
"gz": 150,
"fjcb": 0.33
},
"C025": {
"ycl": 510,
"gz": 150,
"fjcb": 0.29
},
"C026": {
"ycl": 840,
"gz": 300,
"fjcb": 0.36
},
"C027": {
"ycl": 960,
"gz": 300,
"fjcb": 0.31
},
"C028": {
"ycl": 1050,
"gz": 300,
"fjcb": 0.29
},
"C029": {
"ycl": 1350,
"gz": 450,
"fjcb": 0.33
},
"C030": {
"ycl": 1650,
"gz": 450,
"fjcb": 0.27
},
"C031": {
"ycl": 500,
"gz": 1000,
"fjcb": 2
},
"C032": {
"ycl": 1320,
"gz": 2000,
"fjcb": 1.52
},
"C033": {
"ycl": 1900,
"gz": 3000,
"fjcb": 1.58
},
"C034": {
"ycl": 1000,
"gz": 1000,
"fjcb": 1
},
"C035": {
"ycl": 1100,
"gz": 1050,
"fjcb": 0.95
}
},
"运输成本": {
"C036": {
"sjmc": "车路",
"xjb": 1.33
},
"C037": {
"sjmc": "水路",
"xjb": 1
}
}
}
\ No newline at end of file
[
[
{
"userId": "1727399696222",
"loginId": "玩家1",
"pwd": "123456"
},
{
"userId": "1729153582461",
"loginId": "玩家2",
"pwd": "123456"
},
{
"userId": "1730359559228",
"loginId": "admin",
"pwd": "123456"
},
{
"userId": "1730359573927",
"loginId": "123",
"pwd": "123"
},
{
"userId": "1730970187744",
"loginId": "111",
"pwd": "111"
},
{
"userId": 1730970810891,
"loginId": "333",
"pwd": "333"
}
]
\ No newline at end of file
{ {
{ {
"1729153582461": {},
"1730359573927": {},
"1730359559228": {}
} }
\ No newline at end of file
{
{
"SWOT": {
"S": [
"C014",
"C015"
],
"W": [
"C017"
],
"O": [
"C016",
"C020"
],
"T": [
"C018",
"C019"
]
},
"ROI": {
"R": [
"C042",
"C043",
"C044",
"C045",
"C046"
],
"I": [
"C023",
"C024",
"C025",
"C026",
"C027",
"C028",
"C029",
"C030",
"C031",
"C032",
"C033",
"C034",
"C035",
"C036",
"C037",
"C038",
"C039",
"C040",
"C041"
]
},
"竞合": {
"供应商": [
"C003",
"C004"
],
"行业竞争": [
"C005"
],
"跨界竞争": [
"C006",
"C007"
],
"替代竞争": [
"C008",
"C009",
"C010"
],
"消费者": [
"C011"
]
},
"1730359573927": {}
}
\ No newline at end of file
{
{
"1730359573927": {},
"1730359559228": {
"原材料": {
"瓷器": "C040",
"颜料": "C039"
},
"运输": "C037"
}
}
\ No newline at end of file
No preview for this file type
No preview for this file type
/**
* 竞合线索
* 20:竞合线索总分数 (该公式计算错误:N/M*(1/5)*20)
* 分数计算规则:N/M*20
* M:线索总数
* N:选对线索数
* 1/5:细分线索类型数量(供应商、行业竞争、跨界竞争、替代竞争、消费者)
*/
import { NOWCLUE } from "../config/enum";
import { successResult } from "../tools/systemTools";
import { changeJsonData, getJsonData } from "../util/tools";
/**
* 竞合线索确认
* @param subdivide 细分线索类型【供应商、行业竞争、跨界竞争、替代竞争、消费者】
* @param xs [{xsid:"", xsnr:""}, ...]
*/
export function submitJinheClue(userId, subdivide, xs) {
let jsonData = getJsonData("json/竞合.json");
/**处理确认选择的线索 */
let jinheClueData = jsonData;
//没有对应用户数据先添加一个基础格式,有的话直接push
if (!jinheClueData[userId] || Object.keys(jinheClueData[userId]).length === 0) {
jinheClueData[userId] = {
"isSubmit": false,
"供应商": [],
"行业竞争": [],
"跨界竞争": [],
"替代竞争": [],
"消费者": []
};
}
//isSubmit:false【未提交】、true【提交】
/**当前线索类型未提交时,可以修改添加线索 */
if (!jinheClueData[userId]["isSubmit"]) {
for (let i = 0; i < xs.length; i++) {
// let xsInfo = xs[i];
jinheClueData[userId][subdivide].push(xs[i]);
}
changeJsonData("json/竞合.json", jinheClueData);
console.log("添加ROI线索成功");
} else {
console.log("线索已提交,无法重复提交");
}
/**修改全部线索.json的对应线索为已选择 isChoice:true */
let allClueJson = getJsonData("json/全部线索.json");
let allClueData = allClueJson;
xs.forEach( info => {
let {xsid, xsnr} = info;
for(let key in allClueData[userId]) {
allClueData[userId][key].forEach( thisClue => {
if(xsid == thisClue.xsid) thisClue.isChoice = true;
})
}
});
changeJsonData("json/全部线索.json", allClueData);
let baseJsonData = getJsonData("json/基础数据.json");
baseJsonData[userId]["当前线索确认"] = NOWCLUE.竞合;
changeJsonData("json/基础数据.json", baseJsonData);
return successResult();
}
/**
* 计算选择正确的竞合线索
* @param userId
*/
export function checkJinhe(userId) {
/**获取细分线索 */
let xfclueJson = getJsonData("json/细分线索.json");
let clueJson = getJsonData("json/竞合.json")[userId];
let sumClue = 0; //线索总数
let rightClue = 0; //选对线索数
let xfclueROIJson = xfclueJson["竞合"];
let score = 0;
let conf = ["供应商", "行业竞争", "跨界竞争", "替代竞争", "消费者"];
for (let i = 0; i < conf.length; i++) {
let allxf = xfclueROIJson[conf[i]] || []; //所有细分的线索
sumClue += allxf.length;
let rightXf = clueJson[conf[i]] || []; //选中提交的细分线索
for (let xf = 0; xf < allxf.length; xf++) {
rightXf.forEach( info => {
if (allxf[xf] == info.xsid) rightClue++;
})
}
}
/**计算分数 */
// score = rightClue/sumClue*(1/5)*20;
score = (rightClue/sumClue)*20;
let submitJsonData = getJsonData("json/提交分数.json");
let submitScore = submitJsonData;
submitScore[userId]["竞合"] = score;
changeJsonData("json/提交分数.json", submitScore);
return successResult();
}
/**
* ROI线索
* 30:ROI线索总分数
* 分数计算规则:暂定
* 满分:净利润超过30
* 20分:净利润大于25,小于30
* 10分:净利润大于20,小于25
* 0分:净利润小于20
*/
import { NOWCLUE } from "../config/enum";
import { guyongTableData } from "../data/table/tableData";
import { successResult } from "../tools/systemTools";
import { changeJsonData, getJsonData } from "../util/tools";
/**
* ROI线索确认
* @param subdivide 细分线索类型【R、O、I】
* @param xs [{xsid:"", xsnr:""}, ...]
*/
export function submitROIClue(userId, subdivide, xs) {
let jsonData = getJsonData("json/ROI.json");
let baseClueJson = getJsonData("json/基础数据.json");
/**处理确认选择的线索 */
let ROIClueData = jsonData;
//没有对应用户数据先添加一个基础格式,有的话直接push
if (!ROIClueData[userId] || Object.keys(ROIClueData[userId]).length === 0) {
ROIClueData[userId] = {
"isSubmit": false,
"R": [],
"I": []
};
}
//isSubmit:false【未提交】、true【提交】
/**当前线索类型未提交时,可以修改添加线索 */
if (!ROIClueData[userId]["isSubmit"]) {
for (let i = 0; i < xs.length; i++) {
// let xsInfo = xs[i];
ROIClueData[userId][subdivide].push(xs[i]);
}
changeJsonData("json/ROI.json", ROIClueData);
console.log("添加ROI线索成功");
} else {
console.log("线索已提交,无法重复提交");
}
/**修改全部线索.json的对应线索为已选择 isChoice:true */
let allClueJson = getJsonData("json/全部线索.json");
let allClueData = allClueJson;
xs.forEach( info => {
let {xsid, xsnr} = info;
for(let key in allClueData[userId]) {
allClueData[userId][key].forEach( thisClue => {
if(xsid == thisClue.xsid) thisClue.isChoice = true;
})
}
/**如果添加的R线索,马可波罗需要支付瓷器金额 */
if (subdivide == "R") {
/**制作瓷器成功,支付定制瓷器金额 */
let excelData = guyongTableData();
let ciqiExcel = excelData['制作瓷器'].dataList;
let ciqiMoney = 0;
let oldgz = 0;
ciqiExcel.forEach( info => {
if (info.xsid == xsid) ciqiMoney = info.sj;
});
//加上定制瓷器金额
baseClueJson[userId]["结算"] = baseClueJson[userId]["结算"] + ciqiMoney * 1000;
}
});
changeJsonData("json/全部线索.json", allClueData);
/**ROI线索选择完成可添加竞合线索 */
baseClueJson[userId]["竞合"] = true;
baseClueJson[userId]["当前线索确认"] = NOWCLUE.ROI;
//更新json数据
changeJsonData("json/基础数据.json", baseClueJson);
return successResult();
}
/**
* 计算选择正确的ROI线索
* @param userId
*/
export function checkROI(userId) {
let gygrJson = getJsonData("json/雇佣选择.json"); //获取雇佣工人表
let 雇佣选择 = gygrJson[userId];
let cqzzJson = getJsonData("json/瓷器制造.json");
/**
* 计算工人、画师、掌柜一起的人员成本
*/
let 人员成本 = cqzzJson["人员成本"];
let worker = {};
for (let key in 雇佣选择["人工"]) {
worker[key] = 人员成本[雇佣选择["人工"][key]].fjcb; //拿到玩家选择工人的附加成本
}
let rycb = 0;
for (let key in worker) {
rycb += worker[key];
}
/**
* 计算原材料成本
*/
let 瓷器成本 = cqzzJson["瓷器"];
let 瓷器利润 = 0;
let 瓷器单价 = 0;
for (let cq in 瓷器成本) {
if(瓷器成本[cq]["瓷器"] == 雇佣选择["原材料"]["瓷器"] && 瓷器成本[cq]["颜料"] == 雇佣选择["原材料"]["颜料"]) {
let dj = 瓷器成本[cq]["单价"];
let gdcb = 瓷器成本[cq]["固定成本"];
瓷器利润 = dj-gdcb;
}
}
/**
* 计算运输成本
*/
let 运输成本 = cqzzJson["运输成本"];
let yscb = 运输成本[雇佣选择["运输"]].xjb;
let 净利润 = (瓷器利润-rycb-yscb)/瓷器单价;
/**计算分数 */
let score = 0;
if (净利润>30) score = 30;
if (净利润>25 && 净利润<30) score = 20;
if (净利润>20 && 净利润<25) score = 10;
if (净利润<20) score = 0;
let submitJsonData = getJsonData("json/提交分数.json");
let submitScore = submitJsonData;
submitScore[userId]["ROI"] = score;
changeJsonData("json/提交分数.json", submitScore);
return successResult();
}
/**
* SWOT线索
* 50:SWOT线索总分数 (该公式计算错误:N/M*(1/4)*50)
* 分数计算规则:N/M*50
* M:线索总数
* N:选对线索数
* 1/4:细分线索类型数量(S、W、O、T)
*/
import { HARITYPE, NOWCLUE } from "../config/enum";
import { successResult } from "../tools/systemTools";
import { changeJsonData, getJsonData } from "../util/tools";
/**
* SWOT线索确认
* @param subdivide 细分线索类型【S、W、O、T】
* @param xs [{xsid:"", xsnr:""}, ...]
*/
export function submitSWOTClue(userId, subdivide, xs) {
let jsonData = getJsonData("json/SWOT.json");
/**处理确认选择的线索 */
let SWOTClueData = jsonData;
//没有对应用户数据先添加一个基础格式,有的话直接push
if (!SWOTClueData[userId] || Object.keys(SWOTClueData[userId]).length === 0) {
SWOTClueData[userId] = {
"isSubmit": false,
"S": [],
"W": [],
"O": [],
"T": []
};
}
//isSubmit:false【未提交】、true【提交】
/**当前线索类型未提交时,可以修改添加线索 */
if (!SWOTClueData[userId]["isSubmit"]) {
for (let i = 0; i < xs.length; i++) {
// let xsInfo = xs[i];
SWOTClueData[userId][subdivide].push(xs[i]);
}
changeJsonData("json/SWOT.json", SWOTClueData);
console.log("添加SWOT线索成功");
} else {
console.log("线索已提交,无法重复提交");
}
/**修改全部线索.json的对应线索为已选择 isChoice:true */
let allClueJson = getJsonData("json/全部线索.json");
let allClueData = allClueJson;
xs.forEach( info => {
let {xsid, xsnr} = info;
for(let key in allClueData[userId]) {
allClueData[userId][key].forEach( thisClue => {
if(xsid == thisClue.xsid) thisClue.isChoice = true;
})
}
});
changeJsonData("json/全部线索.json", allClueData);
let baseJsonData = getJsonData("json/基础数据.json");
baseJsonData[userId]["当前线索确认"] = NOWCLUE.SWOT;
baseJsonData[userId]["酒馆剧情"] = HARITYPE.已开始;
changeJsonData("json/基础数据.json", baseJsonData);
return successResult();
}
/**
* 计算选择正确的SWOT线索
* @param userId
*/
export function checkSWOT(userId) {
/**获取细分线索 */
let xfclueJson = getJsonData("json/细分线索.json");
let clueJson = getJsonData("json/SWOT.json")[userId];
let sumClue = 0; //线索总数
let rightClue = 0; //选对线索数
let xfclueSWOTJson = xfclueJson["SWOT"];
let conf = ["S", "W", "O", "T"];
for (let i = 0; i < conf.length; i++) {
let allxf = xfclueSWOTJson[conf[i]] || []; //所有细分的线索
sumClue += allxf.length;
let rightXf = clueJson[conf[i]] || []; //选中提交的细分线索
for (let xf = 0; xf < allxf.length; xf++) {
rightXf.forEach( info => {
if (allxf[xf] == info.xsid) rightClue++; //计算当前选对线索数
})
}
}
/**计算分数 */
let score = 0;
// score = rightClue/sumClue*(1/4)*50;
score = (rightClue/sumClue)*50;
let submitJsonData = getJsonData("json/提交分数.json");
let submitScore = submitJsonData;
submitScore[userId]["SWOT"] = score;
changeJsonData("json/提交分数.json", submitScore);
return successResult();
}
/**
* 初始化全部线索
*/
import { HARITYPE, NOWCLUE } from "../config/enum";
import { guyongTableData, xiansuoTableData } from "../data/table/tableData";
import { changeJsonData, getJsonData } from "../util/tools";
/**
* 登录账号的时候判断是否有初始化全部线索,没有的话写入全部线索json
* 基础数据没有的话也写入
*/
export function initAllClue(userId) {
let excelData = xiansuoTableData();
let clueExcelData = excelData["线索表"].dataList;
let userJsonData = getJsonData("json/用户.json");
let allClueJsonData = getJsonData("json/全部线索.json");
let baseJsonData = getJsonData("json/基础数据.json");
let submitJsonData = getJsonData("json/提交分数.json");
let writeClueAll = allClueJsonData;
let writeBaseAll = baseJsonData;
let submitClue = submitJsonData;
/**如果登录的账号没有全部线索数据,则写入json */
if (!allClueJsonData[userId] || Object.keys(allClueJsonData[userId]).length === 0) {
writeClueAll[userId] = {};
clueExcelData.forEach( info => {
let {xsid, xsnr, xslx, xslxxf, sfbx} = info;
if (!writeClueAll[userId][xslx]) writeClueAll[userId][xslx] = [];
writeClueAll[userId][xslx].push({xsid, xsnr, isChoice:false, sfbx});
})
//写入json
changeJsonData("json/全部线索.json", writeClueAll);
}
/**如果登录的账号没有基础数据,则写入json */
if (!baseJsonData[userId] || Object.keys(baseJsonData[userId]).length === 0) {
writeBaseAll[userId] = {
"初始资金": 500,
"天数":0,
"结算":500,
"广州府介绍": true, //广州府第一次介绍:true
// "酒馆雇佣": false, //酒馆已选择雇佣工人:true
"酒馆剧情": HARITYPE.未开始, //酒馆剧情:默认未开始,已开始需要SWOT确认
"当前线索确认": NOWCLUE.未开始,
"商行选择":false,
"SWOT": false,
"ROI": false,
"竞合": false
}
//写入json
changeJsonData("json/基础数据.json", writeBaseAll);
}
/**如果登录的账号没有初始化分数数据,则写入json */
if (!submitJsonData[userId] || Object.keys(submitJsonData[userId]).length === 0) {
submitClue[userId] = {
SWOT:0,
ROI:0,
竞合:0
};
//写入json
changeJsonData("json/提交分数.json", submitClue);
}
}
/**
* 初始化制作瓷器成本数据
*/
export function initCiqi() {
let excelData = guyongTableData();
let 雇佣Data = excelData['雇佣表'].dataList;
let 运输Data = excelData['运输'].dataList;
let 原材料Data = excelData['原材料'].dataList;
let 人员成本 = {};
雇佣Data.forEach( info => {
let {lx, xsid, nlsjz, xqz, gz} = info //线索id,能力值,心情值,工资
let ycl = 0; //月产量 = 能力值*心情值*30
if (lx == "工人") ycl = nlsjz*xqz*30;
if (lx == "画师") ycl = nlsjz*xqz*20;
if (lx == "掌柜") ycl = nlsjz*xqz*10;
let fjcb = Math.round((gz/ycl)*100)/100; //附加成本 = 工资/月产量
人员成本[xsid] = {ycl, gz, fjcb};
})
let 运输成本 = {};
运输Data.forEach( info => {
let {xsid, sjmc, jg, myysl} = info; //线索id,运输类型(车路、水路),价格,每月运输量(速度)
let xjb = Math.round((jg/myysl)*100)/100; //性价比 = 价格/速度
运输成本[xsid] = {sjmc, xjb};
})
let 原材料 = {};
原材料Data.forEach( info => {
let {xsid, sjmc, jg} = info;
原材料[sjmc] = {xsid, jg:parseInt(jg)};
})
let 瓷器 = {
"定制精美瓷器": {
"瓷器":原材料["定制瓷器"].xsid,
"颜料":原材料["优质颜料"].xsid,
"单价":300,
"固定成本":原材料["定制瓷器"].jg + 原材料["优质颜料"].jg,
},
"定制普通瓷器": {
"瓷器":原材料["定制瓷器"].xsid,
"颜料":原材料["普通颜料"].xsid,
"单价":270,
"固定成本":原材料["定制瓷器"].jg + 原材料["普通颜料"].jg,
},
"通用精美瓷器": {
"瓷器":原材料["通用瓷器"].xsid,
"颜料":原材料["优质颜料"].xsid,
"单价":170,
"固定成本":原材料["通用瓷器"].jg + 原材料["优质颜料"].jg,
},
"通用普通瓷器": {
"瓷器":原材料["通用瓷器"].xsid,
"颜料":原材料["普通颜料"].xsid,
"单价":150,
"固定成本":原材料["通用瓷器"].jg + 原材料["普通颜料"].jg,
}
};
let 成本 = {瓷器, 人员成本, 运输成本}
changeJsonData("json/瓷器制造.json", 成本);
}
/**
* 游戏天数
* 登录开始计算 5分钟加一天
* @param userId
*/
export function gameLoop(userId) {
let baseJsonData = getJsonData("json/基础数据.json");
// let baseData = baseJsonData[userId];
baseJsonData[userId]["天数"]++;
//60000毫秒 = 1分钟,设定5分钟游戏内天数+1
setTimeout(gameLoop, 60000*5, userId);
changeJsonData("json/基础数据.json", baseJsonData);
}
/**
* 登录
* 用户.json 登录用户账号信息
*/
import { ERRORENUM } from "../config/errorEnum";
import { successResult } from "../tools/systemTools";
import { BizError } from "../util/bizError";
import { changeJsonData, getJsonData } from "../util/tools";
import { gameLoop, initAllClue } from "./task";
/**
* 登录
* @param loginId 账号
* @param pwd 密码
*/
export function login(loginId, pwd) {
let userData = getJsonData("json/用户.json");
let dataInfo = {};
/**判断是否有对应账号 */
let hasUser = userData.some(item => item.loginId === loginId);
if (!hasUser) throw new BizError(ERRORENUM.账号不存在);
userData.forEach( info => {
initAllClue(info.userId);
if (info.loginId == loginId) {
if (info.pwd != pwd) throw new BizError(ERRORENUM.账号或密码错误);
dataInfo = {userId:info.userId, loginId:info.loginId};
gameLoop(info.userId);
}
// dataInfo["firstlogin"] = initAllClue(info.userId);
})
return dataInfo;
}
/**
* 注册
* @param loginId 账号
* @param pwd 密码
*/
export function register(loginId, pwd) {
let userData = getJsonData("json/用户.json");
const NowMs = new Date().valueOf();
userData.push(
{
userId:`${NowMs}`,
loginId,
pwd
}
);
changeJsonData("json/用户.json", userData);
return successResult();
}
/**
* 基础数据【当前天数、银两数】
* @returns
*/
export function getBaseData(userId) {
let baseData = getJsonData("json/基础数据.json");
let basicsData = {
day:0,
tael:0
}
basicsData.day = baseData[userId]["天数"] || 0;
basicsData.tael = baseData[userId]["结算"] || 0;
return basicsData;
}
/**
* 统计线索数量
* @param clueType
* @returns
*/
export function getCount(userId) {
let jsonData = getJsonData("json/全部线索.json");
let clueData = jsonData[userId];
let personalData = {
clue:0,
tael:0,
hire:0
};
// 线索数
for (let key in clueData) {
clueData[key].forEach( info => {
if (info.isChoice) personalData.clue++
})
}
// 银两数
let baseData = getJsonData("json/基础数据.json");
personalData.tael = baseData[userId]["结算"];
// 雇佣人数
let hireData = getJsonData("json/雇佣选择.json");
if (Object.keys(hireData[userId]).length != 0) {
if (!hireData[userId]["人工"]) hireData[userId]["人工"] = {}
if (Object.keys(hireData[userId]["人工"]).length != 0) {
personalData.hire = Object.keys(hireData[userId]["人工"]).length;
}
}
return personalData;
}
...@@ -27,8 +27,18 @@ export enum FILETYPE { ...@@ -27,8 +27,18 @@ export enum FILETYPE {
} }
export enum NOWCLUE {
未开始 = 0,
SWOT = 1,
ROI,
竞合
}
export enum HARITYPE {
未开始 = 0,
已开始 = 1,
已选择 = 2
}
...@@ -61,7 +61,9 @@ export enum ERRORENUM { ...@@ -61,7 +61,9 @@ export enum ERRORENUM {
用户没有在此活动对象内, 用户没有在此活动对象内,
黑名单用户不允许登录, 黑名单用户不允许登录,
该订单未被退回, 该订单未被退回,
文件不存在 文件不存在,
账号不存在,
需先确认SWOT线索选择
} }
export enum ERRORCODEENUM { export enum ERRORCODEENUM {
......
...@@ -9,27 +9,27 @@ let daier = {}; ...@@ -9,27 +9,27 @@ let daier = {};
* 初始化表格数据,加密保存到daier.yydata * 初始化表格数据,加密保存到daier.yydata
*/ */
export async function initConfiguration() { export async function initConfiguration() {
daier = { // daier = {
// "剧情表": tableData.juqingTableData(), // // "剧情表": tableData.juqingTableData(),
"线索表": tableData.xiansuoTableData(), // "线索表": tableData.xiansuoTableData(),
"工资表": tableData.gongziTableData(), // "工资表": tableData.gongziTableData(),
}; // };
//创建一个AES-256-CBC的加密算法 // //创建一个AES-256-CBC的加密算法
const algorithm = 'aes-256-cbc'; // const algorithm = 'aes-256-cbc';
let key = systemConfig.cryptoKey; // let key = systemConfig.cryptoKey;
let iv = systemConfig.cryptoIv; // let iv = systemConfig.cryptoIv;
//创建一个cipher实例 // //创建一个cipher实例
const cipher = crypto.createCipheriv(algorithm, key, iv); // const cipher = crypto.createCipheriv(algorithm, key, iv);
/**加密数据 */ // /**加密数据 */
let encrypted = cipher.update(daier, 'utf8', 'hex'); // let encrypted = cipher.update(daier, 'utf8', 'hex');
encrypted += cipher.final('hex'); // encrypted += cipher.final('hex');
//将IV和加密后的数据一起写入文件 // //将IV和加密后的数据一起写入文件
let dataToWrite = `${iv}:${encrypted}`; // let dataToWrite = `${iv}:${encrypted}`;
//写入自定义后缀的文件 // //写入自定义后缀的文件
fs.writeFile('daier.yydata', dataToWrite, (err) => { // fs.writeFile('daier.yydata', dataToWrite, (err) => {
if (!err) console.log("数据已成功写入daier.yydata"); // if (!err) console.log("数据已成功写入daier.yydata");
}) // })
} }
......
...@@ -49,6 +49,20 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, ...@@ -49,6 +49,20 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList,
export function juqingTableData(type, playId) { export function juqingTableData(type, playId) {
let blockDataList = onceSheetBecomeOfblockData('剧情表.xlsx', `${type}`); //excel表名 sheet名称 let blockDataList = onceSheetBecomeOfblockData('剧情表.xlsx', `${type}`); //excel表名 sheet名称
// let blockTitleList = {};
// let keyToLookup;
// blockDataList.forEach( info => {
// let blockTitle = info.blockTitle;
// let hasUndersocre = blockTitle.includes('_');
// if (hasUndersocre) {
// keyToLookup = `${playId}_${duihua}`
// } else {
// keyToLookup = playId;
// }
// })
let keyValueOrTitleList = [`${playId}`]; //适配 饼图 键值以及需要多个Key的 let keyValueOrTitleList = [`${playId}`]; //适配 饼图 键值以及需要多个Key的
// if (playId) keyValueOrTitleList.push(playId); // if (playId) keyValueOrTitleList.push(playId);
let barChartList = []; //适配 柱状图 折线图 let barChartList = []; //适配 柱状图 折线图
...@@ -81,9 +95,6 @@ export function NPCTableData() { ...@@ -81,9 +95,6 @@ export function NPCTableData() {
} }
/** /**
* 线索表 * 线索表
* @returns * @returns
...@@ -103,13 +114,13 @@ export function xiansuoTableData() { ...@@ -103,13 +114,13 @@ export function xiansuoTableData() {
/** /**
* 工资 * 雇佣
* @returns * @returns
*/ */
export function gongziTableData() { export function guyongTableData() {
let blockDataList = onceSheetBecomeOfblockData('线索表.xlsx', 'Sheet2'); //excel表名 sheet名称 let blockDataList = onceSheetBecomeOfblockData('线索表.xlsx', 'Sheet2'); //excel表名 sheet名称
let keyValueOrTitleList = ['工资表']; //适配 饼图 键值以及需要多个Key的 let keyValueOrTitleList = ['雇佣表', '运输', '原材料', '制作瓷器']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图 let barChartList = []; //适配 柱状图 折线图
let stringList= []; let stringList= [];
let decollatePlanarList = []; //适配 表格 let decollatePlanarList = []; //适配 表格
......
...@@ -2,13 +2,14 @@ import { httpServer } from "./net/http_server"; ...@@ -2,13 +2,14 @@ import { httpServer } from "./net/http_server";
import { initConfig, systemConfig } from "./config/serverConfig"; import { initConfig, systemConfig } from "./config/serverConfig";
import { initConfiguration } from "./data/table/initConfiguration"; import { initConfiguration } from "./data/table/initConfiguration";
import { cxyxTableData } from "./data/table/tableData"; import { cxyxTableData } from "./data/table/tableData";
import { initCiqi } from "./biz/task";
async function lanuch() { async function lanuch() {
await initConfig(); await initConfig();
httpServer.createServer( systemConfig.port ); httpServer.createServer( systemConfig.port );
console.log('This indicates that the server is started successfully.'); console.log('This indicates that the server is started successfully.');
initCiqi();
// let key = crypto.randomBytes(32).toString('hex'); //"4fa9998e3be1bd3fa7b8def3969115858c6f19f9ef36e2e71f61645e9767764c" // let key = crypto.randomBytes(32).toString('hex'); //"4fa9998e3be1bd3fa7b8def3969115858c6f19f9ef36e2e71f61645e9767764c"
// let iv = crypto.randomBytes(16).toString('hex'); //"db2be0c856f44e68b818ff6ef7f018c1" // let iv = crypto.randomBytes(16).toString('hex'); //"db2be0c856f44e68b818ff6ef7f018c1"
// await initConfiguration(); // await initConfiguration();
......
import { ERRORENUM } from "../config/errorEnum";
import { BizError } from "../util/bizError";
/**
* 中间件
* @param req
* @param res
* @param next
* @returns
*/
export async function checkUser(req, res, next) {
if (!req.headers) req.headers = {};
let userId = req.headers.userid;
if (!userId) return next(new BizError(ERRORENUM.非法登录));
req.userId = userId
next();
}
...@@ -15,7 +15,7 @@ export class httpServer { ...@@ -15,7 +15,7 @@ export class httpServer {
httpServer.all('*',function (req, res, next) { httpServer.all('*',function (req, res, next) {
res.header('Access-Control-Allow-Origin', req.headers.origin); res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header('Access-Control-Allow-Headers', 'Content-Type'); res.header('Access-Control-Allow-Headers', 'Content-Type,request-origin,userid,token');
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Credentials', true);
res.header("X-Powered-By", ' 3.2.1'); res.header("X-Powered-By", ' 3.2.1');
......
...@@ -5,6 +5,24 @@ import { FILETYPE } from "../config/enum"; ...@@ -5,6 +5,24 @@ import { FILETYPE } from "../config/enum";
const md5 = require("md5"); const md5 = require("md5");
/**
* 返回编辑正确的结果
* @returns
*/
export function successResult() {
return {success:true}
}
/**
* 抛出错误信息
* @returns
*/
export function successErrorResult(msg) {
return {code:500, success:false, msg};
}
export function getUserToken(loginId:string) { export function getUserToken(loginId:string) {
return md5(`${loginId}_${Math.ceil(Math.random()*1000)}${new Date().valueOf()}`); return md5(`${loginId}_${Math.ceil(Math.random()*1000)}${new Date().valueOf()}`);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment