diff --git a/src/constant/err.type.js b/src/constant/err.type.js index 210512a..f18c056 100644 --- a/src/constant/err.type.js +++ b/src/constant/err.type.js @@ -13,4 +13,7 @@ module.exports = { noAdminPermission: Response("40003", "没有超级管理员权限"), houseNameAlreadyExisted: Response("50001", "鸡厂名称已存在"), coopNameAlreadyExisted: Response("50002", "鸡舍名称重复"), + varietyNameAlreadyExisted: Response("50003", "鸡苗品种名称重复"), + varietyReasonNameAlreadyExisted: Response("50004", "死亡原因名称重复"), + factoryNameAlreadyExisted: Response("50005", "鸡苗厂家名称重复"), }; diff --git a/src/controller/reason.controller.js b/src/controller/reason.controller.js index 788e74d..0a72c3d 100644 --- a/src/controller/reason.controller.js +++ b/src/controller/reason.controller.js @@ -4,7 +4,6 @@ const { addDieReason, } = require("../service/reason.service"); const Response = require("../utils/response"); - class ReasonController { async list(ctx, next) { const res = await getAllReason(); diff --git a/src/db/seq.js b/src/db/seq.js index b447ac3..301aee8 100644 --- a/src/db/seq.js +++ b/src/db/seq.js @@ -1,5 +1,10 @@ const { Sequelize } = require("sequelize"); +// Sequelize 支持两种使用事务的方式: + +// 非托管事务:  提交和回滚事务应该手动完成(通过调用适当的 Sequelize 方法) +// 托管事务: 如果抛出任何错误, Sequelize 将会自动回滚事务, 否则将提交事务, 另外,如果启用了CLS(连续本地存储), 则事务回调中的所有查询将自动接收事务对象 + const { MYSQL_HOST, MYSQL_PORT, diff --git a/src/middleware/factory.middleware.js b/src/middleware/factory.middleware.js new file mode 100644 index 0000000..3894f27 --- /dev/null +++ b/src/middleware/factory.middleware.js @@ -0,0 +1,15 @@ +const { getFactoryByName } = require("../service/factory.service"); +const { factoryNameAlreadyExisted } = require("../constant/err.type"); + +const verifyFactoryExisted = async (ctx, next) => { + const { factory_name } = ctx.request.body; + if (await getFactoryByName(factory_name)) { + ctx.app.emit("error", factoryNameAlreadyExisted, ctx); + return; + } + await next(); +}; + +module.exports = { + verifyFactoryExisted, +}; diff --git a/src/middleware/reason.middleware.js b/src/middleware/reason.middleware.js new file mode 100644 index 0000000..d668b64 --- /dev/null +++ b/src/middleware/reason.middleware.js @@ -0,0 +1,15 @@ +const { getReasonByName } = require("../service/reason.service"); +const { varietyReasonNameAlreadyExisted } = require("../constant/err.type"); + +const verifyReasonExisted = async (ctx, next) => { + const { reason_name } = ctx.request.body; + if (await getReasonByName(reason_name)) { + ctx.app.emit("error", varietyReasonNameAlreadyExisted, ctx); + return; + } + await next(); +}; + +module.exports = { + verifyReasonExisted, +}; diff --git a/src/middleware/variety.middleware.js b/src/middleware/variety.middleware.js new file mode 100644 index 0000000..94e21fa --- /dev/null +++ b/src/middleware/variety.middleware.js @@ -0,0 +1,15 @@ +const { getVarietyByName } = require("../service/variety.service"); +const { varietyNameAlreadyExisted } = require("../constant/err.type"); + +const verifyVarietyExisted = async (ctx, next) => { + const { variety_name } = ctx.request.body; + if (await getVarietyByName(variety_name)) { + ctx.app.emit("error", varietyNameAlreadyExisted, ctx); + return; + } + await next(); +}; + +module.exports = { + verifyVarietyExisted, +}; diff --git a/src/model/coop.model.js b/src/model/coop.model.js index 28c3110..4209f17 100644 --- a/src/model/coop.model.js +++ b/src/model/coop.model.js @@ -24,6 +24,12 @@ const Coop = seq.define("chicken_coop", { allowNull: false, comment: "所属鸡场id, 相当于外键", }, + is_empty: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: 1, + comment: "是否为空舍,1为空,0为非空", + }, }); // 强制同步数据库(创建数据表) diff --git a/src/router/factory.route.js b/src/router/factory.route.js index ab6692d..d85eca4 100644 --- a/src/router/factory.route.js +++ b/src/router/factory.route.js @@ -3,11 +3,12 @@ const Router = require("koa-router"); const router = new Router({ prefix: "/factory" }); const { auth, hasAdminPermission } = require("../middleware/auth.middleware"); +const { verifyFactoryExisted } = require("../middleware/factory.middleware"); const { list, add, deleteItem } = require("../controller/factory.controller"); router.get("/list", auth, list); -router.post("/add", auth, hasAdminPermission, add); +router.post("/add", auth, hasAdminPermission, verifyFactoryExisted, add); router.post("/del", auth, hasAdminPermission, deleteItem); diff --git a/src/router/reason.route.js b/src/router/reason.route.js index 0f5d861..7183f63 100644 --- a/src/router/reason.route.js +++ b/src/router/reason.route.js @@ -4,10 +4,11 @@ const router = new Router({ prefix: "/reason" }); const { auth, hasAdminPermission } = require("../middleware/auth.middleware"); const { list, add, deleteItem } = require("../controller/reason.controller"); +const { verifyReasonExisted } = require("../middleware/reason.middleware"); router.get("/list", auth, list); -router.post("/add", auth, hasAdminPermission, add); +router.post("/add", auth, hasAdminPermission, verifyReasonExisted, add); router.post("/del", auth, hasAdminPermission, deleteItem); diff --git a/src/router/variety.route.js b/src/router/variety.route.js index b32f8f0..f6a3264 100644 --- a/src/router/variety.route.js +++ b/src/router/variety.route.js @@ -3,11 +3,12 @@ const Router = require("koa-router"); const router = new Router({ prefix: "/variety" }); const { auth, hasAdminPermission } = require("../middleware/auth.middleware"); +const { verifyVarietyExisted } = require("../middleware/variety.middleware"); const { list, add, deleteItem } = require("../controller/variety.controller"); router.get("/list", auth, list); -router.post("/add", auth, hasAdminPermission, add); +router.post("/add", auth, hasAdminPermission, verifyVarietyExisted, add); router.post("/del", auth, hasAdminPermission, deleteItem); diff --git a/src/service/chicken.service.js b/src/service/chicken.service.js index 1054e91..f9960ba 100644 --- a/src/service/chicken.service.js +++ b/src/service/chicken.service.js @@ -8,7 +8,10 @@ const { const { getHouseById } = require("./house.service"); const { getFactoryById } = require("./factory.service"); const { getVarietyById } = require("./variety.service"); -const { getBatchCoopByIds } = require("./coop.service"); +const { + getBatchCoopByIds, + batchUpdateCoopStatusByIds, +} = require("./coop.service"); const { getAccountInfo } = require("./account.service"); const { getTotalFeedingByCoopId } = require("./feeding.service"); const { Op, Sequelize } = require("sequelize"); @@ -41,6 +44,8 @@ class ChickenService { batch_number, real_life_init_time, }); + // 新进鸡苗后需要将进入的鸡舍状态变为非空舍 + const coopRes = await batchUpdateCoopStatusByIds(coop_id, 0); return res ? res.dataValues : null; } diff --git a/src/service/coop.service.js b/src/service/coop.service.js index 82cbb4a..f2e6246 100644 --- a/src/service/coop.service.js +++ b/src/service/coop.service.js @@ -61,6 +61,22 @@ class CoopService { return arr; } + async batchUpdateCoopStatusByIds(ids, status) { + const res = await Coop.update( + { + is_empty: status, + }, + { + where: { + id: { + [Op.in]: ids, + }, + }, + } + ); + return res; + } + async updateCoop(coop_name, coop_cage_number, chicken_number, house_id, id) { const res = await Coop.update( { diff --git a/src/service/factory.service.js b/src/service/factory.service.js index face72a..0973dfa 100644 --- a/src/service/factory.service.js +++ b/src/service/factory.service.js @@ -23,6 +23,15 @@ class FactoryService { return res?.dataValues; } + async getFactoryByName(factory_name) { + const whereOpt = {}; + factory_name && Object.assign(whereOpt, { factory_name }); + const res = await Factory.findOne({ + where: whereOpt, + }); + return res ? res.dataValues : null; + } + async deleteFactoryById(id) { const res = await Factory.destroy({ where: { diff --git a/src/service/reason.service.js b/src/service/reason.service.js index 479fbe1..04c7292 100644 --- a/src/service/reason.service.js +++ b/src/service/reason.service.js @@ -22,6 +22,15 @@ class ReasonService { return res?.dataValues; } + async getReasonByName(reason_name) { + const whereOpt = {}; + reason_name && Object.assign(whereOpt, { reason_name }); + const res = await Reason.findOne({ + where: whereOpt, + }); + return res ? res.dataValues : null; + } + async deleteReasonById(id) { const res = await Reason.destroy({ where: { diff --git a/src/service/variety.service.js b/src/service/variety.service.js index 94f1fe0..e95ec80 100644 --- a/src/service/variety.service.js +++ b/src/service/variety.service.js @@ -15,6 +15,15 @@ class VarietyService { return res ? res.dataValues : null; } + async getVarietyByName(variety_name) { + const whereOpt = {}; + variety_name && Object.assign(whereOpt, { variety_name }); + const res = await Variety.findOne({ + where: whereOpt, + }); + return res ? res.dataValues : null; + } + async addVariety(variety_name) { const res = await Variety.create({ variety_name,