|
@@ -297,29 +297,57 @@ class GljDao extends OprDao{
|
|
|
|
|
|
static addGljItems (repId, lastOpr, items, callback) {
|
|
|
if (items && items.length > 0) {
|
|
|
- counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, items.length, function(err, result){
|
|
|
- var maxId = result.sequence_value;
|
|
|
- var arr = [];
|
|
|
- for (var i = 0; i < items.length; i++) {
|
|
|
- var obj = new gljModel(items[i]);
|
|
|
- obj.ID = (maxId - (items.length - 1) + i);
|
|
|
- obj.repositoryId = repId;
|
|
|
- arr.push(obj);
|
|
|
+ const codes = [];
|
|
|
+ items.forEach(item => codes.push(item.code));
|
|
|
+ gljModel.find({repositoryId: repId, code: {$in: codes}}, '-_id code', {lean: true}, (err, codeData) => {
|
|
|
+ if (err) {
|
|
|
+ callback(true, '判断编码唯一性失败', false);
|
|
|
+ return;
|
|
|
}
|
|
|
- gljModel.collection.insert(arr, null, function(err, docs){
|
|
|
- if (err) {
|
|
|
- callback(true, "Fail to add", false);
|
|
|
+ const insertData = [];
|
|
|
+ const failCode = [];
|
|
|
+ items.forEach(item => {
|
|
|
+ const matchData = codeData.find(codeItem => codeItem.code === item.code);
|
|
|
+ if (!matchData) {
|
|
|
+ insertData.push(item);
|
|
|
} else {
|
|
|
+ failCode.push(item.code);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (!insertData.length) {
|
|
|
+ callback(false, 'empty data', {insertData, failCode});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ counter.counterDAO.getIDAfterCount(counter.moduleName.GLJ, items.length, (counterErr, counterData) => {
|
|
|
+ if (counterErr) {
|
|
|
+ callback(true, '获取人材机ID失败', false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const maxId = counterData.sequence_value;
|
|
|
+ for (let i = 0; i < insertData.length; i++) {
|
|
|
+ insertData[i].ID = (maxId - (insertData.length - 1) + i);
|
|
|
+ insertData[i].repositoryId = repId;
|
|
|
+ }
|
|
|
+ const task = [];
|
|
|
+ insertData.forEach(item => {
|
|
|
+ task.push({
|
|
|
+ insertOne: {document: item}
|
|
|
+ });
|
|
|
+ });
|
|
|
+ gljModel.bulkWrite(task, (insertErr, rst) => {
|
|
|
+ if (insertErr) {
|
|
|
+ callback(true, '新增数据失败', false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
GljDao.updateOprArr({ID: repId}, lastOpr, moment(Date.now()).format('YYYY-MM-DD HH:mm:ss'), function (err) {
|
|
|
if(err){
|
|
|
callback(true, "Fail to update Operator", false);
|
|
|
- }
|
|
|
- else{
|
|
|
- callback(false, "Add successfully", docs);
|
|
|
+ } else{
|
|
|
+ callback(false, "Add successfully", {insertData, failCode});
|
|
|
}
|
|
|
});
|
|
|
- }
|
|
|
- })
|
|
|
+ });
|
|
|
+ });
|
|
|
});
|
|
|
} else {
|
|
|
callback(true, "No source", false);
|
|
@@ -637,6 +665,64 @@ class GljDao extends OprDao{
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ async importComponents(gljLibId, sheetData) {
|
|
|
+ const gljLib = await gljMapModel.findOne({ID: gljLibId});
|
|
|
+ if (!gljLib) {
|
|
|
+ throw '不存在此人材机库';
|
|
|
+ }
|
|
|
+ const compilation = await compilationModel.findOne({_id: mongoose.Types.ObjectId(gljLib.compilationId)});
|
|
|
+ if (!compilation) {
|
|
|
+ throw '不存在此费用定额';
|
|
|
+ }
|
|
|
+ // 将所有人材机进行编码映射
|
|
|
+ const allGLJs = await gljModel.find({repositoryId: gljLibId}, {ID: true, code: true}).lean();
|
|
|
+ const codeMapping = {};
|
|
|
+ allGLJs.forEach(glj => codeMapping[glj.code] = glj);
|
|
|
+ // excel表格列号与字段的映射
|
|
|
+ const colMapping = {
|
|
|
+ // 材料编码
|
|
|
+ code: 0,
|
|
|
+ // 组成物编码
|
|
|
+ componentCode: 1,
|
|
|
+ // 组成物消耗量
|
|
|
+ consumeAmt: 2
|
|
|
+ };
|
|
|
+ // 跳过列头
|
|
|
+ for (let row = 1; row < sheetData.length; row++) {
|
|
|
+ const rowData = sheetData[row];
|
|
|
+ const code = rowData[colMapping.code];
|
|
|
+ const componentCode = rowData[colMapping.componentCode];
|
|
|
+ const consumeAmt = +rowData[colMapping.consumeAmt];
|
|
|
+ const glj = codeMapping[code];
|
|
|
+ const component = codeMapping[componentCode];
|
|
|
+ if (!glj || !component) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!glj.component) {
|
|
|
+ glj.component = [];
|
|
|
+ }
|
|
|
+ glj.component.push({
|
|
|
+ ID: component.ID,
|
|
|
+ consumeAmt: consumeAmt
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 更新数据
|
|
|
+ const tasks = [];
|
|
|
+ allGLJs.filter(glj => glj.component && glj.component.length).forEach(glj => {
|
|
|
+ tasks.push({
|
|
|
+ updateOne: {
|
|
|
+ filter: {
|
|
|
+ ID: glj.ID
|
|
|
+ },
|
|
|
+ update: {$set: {component: glj.component}}
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ if (tasks.length) {
|
|
|
+ await gljModel.bulkWrite(tasks);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
export default GljDao;
|