routes_zichan_transfer.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. import { Hono } from "hono";
  2. import debug from "debug";
  3. import type {
  4. ZichanTransLog
  5. } from "../client/share/monitorTypes.ts";
  6. import type { Variables, WithAuth } from "./middlewares.ts";
  7. const log = {
  8. api: debug("d8d:zichan:api"),
  9. };
  10. // 创建资产流转管理路由
  11. export function createZichanTransferRoutes(withAuth: WithAuth) {
  12. const zichanTransferRoutes = new Hono<{ Variables: Variables }>();
  13. // 获取资产流转记录列表
  14. zichanTransferRoutes.get("/", withAuth, async (c) => {
  15. try {
  16. const apiClient = c.get('apiClient');
  17. // 获取分页参数
  18. const page = Number(c.req.query("page")) || 1;
  19. const limit = Number(c.req.query("limit")) || 10;
  20. const offset = (page - 1) * limit;
  21. // 获取筛选参数
  22. const assetId = c.req.query("asset_id")
  23. ? Number(c.req.query("asset_id"))
  24. : undefined;
  25. const transferType = c.req.query("asset_transfer")
  26. ? Number(c.req.query("asset_transfer"))
  27. : undefined;
  28. // 构建查询
  29. let query = apiClient.database
  30. .table("zichan_trans_log as ztl")
  31. .leftJoin("zichan_info as zi", "ztl.asset_id", "zi.id")
  32. .select("ztl.*", "zi.asset_name as asset_name")
  33. .where("ztl.is_deleted", 0)
  34. .orderBy("ztl.id", "desc");
  35. // 应用筛选条件
  36. if (assetId) {
  37. query = query.where("ztl.asset_id", assetId);
  38. }
  39. if (transferType) {
  40. query = query.where("ztl.asset_transfer", transferType);
  41. }
  42. // 获取总记录数
  43. const countResult = await query.clone().count();
  44. const total = countResult ? Number(countResult) : 0;
  45. // 获取分页数据
  46. const data = await query.limit(limit).offset(offset);
  47. // 处理数据,添加资产信息
  48. const result = data.map((item) => {
  49. return {
  50. ...item,
  51. asset_info: item.asset_name
  52. ? {
  53. id: item.asset_id,
  54. asset_name: item.asset_name,
  55. }
  56. : null,
  57. };
  58. });
  59. // 返回结果
  60. return c.json({
  61. data: result,
  62. pagination: {
  63. total: total,
  64. current: page,
  65. pageSize: limit,
  66. },
  67. });
  68. } catch (error) {
  69. log.api("获取资产流转记录列表失败:", error);
  70. return c.json({ error: "获取资产流转记录列表失败" }, 500);
  71. }
  72. });
  73. // 获取资产流转记录详情
  74. zichanTransferRoutes.get("/:id", withAuth, async (c) => {
  75. try {
  76. const id = Number(c.req.param("id"));
  77. if (!id || isNaN(id)) {
  78. return c.json({ error: "无效的资产流转记录ID" }, 400);
  79. }
  80. const apiClient = c.get('apiClient');
  81. // 查询资产流转记录
  82. const [transferLog] = await apiClient.database
  83. .table("zichan_trans_log as ztl")
  84. .leftJoin("zichan_info as zi", "ztl.asset_id", "zi.id")
  85. .select("ztl.*", "zi.asset_name as asset_name")
  86. .where("ztl.id", id)
  87. .where("ztl.is_deleted", 0);
  88. if (!transferLog) {
  89. return c.json({ error: "资产流转记录不存在" }, 404);
  90. }
  91. // 添加资产信息
  92. transferLog.asset_info = transferLog.asset_name
  93. ? {
  94. id: transferLog.asset_id,
  95. asset_name: transferLog.asset_name,
  96. }
  97. : null;
  98. return c.json(transferLog);
  99. } catch (error) {
  100. log.api("获取资产流转记录详情失败:", error);
  101. return c.json({ error: "获取资产流转记录详情失败" }, 500);
  102. }
  103. });
  104. // 创建资产流转记录
  105. zichanTransferRoutes.post("/", withAuth, async (c) => {
  106. try {
  107. const transferData = (await c.req.json()) as Partial<ZichanTransLog>;
  108. // 验证必填字段
  109. if (!transferData.asset_id) {
  110. return c.json({ error: "资产ID不能为空" }, 400);
  111. }
  112. if (!transferData.asset_transfer) {
  113. return c.json({ error: "资产流转类型不能为空" }, 400);
  114. }
  115. if (!transferData.person) {
  116. return c.json({ error: "人员不能为空" }, 400);
  117. }
  118. const apiClient = c.get('apiClient');
  119. // 检查资产是否存在
  120. const [existingAsset] = await apiClient.database
  121. .table("zichan_info")
  122. .where({ id: transferData.asset_id, is_deleted: 0 });
  123. if (!existingAsset) {
  124. return c.json({ error: "资产不存在" }, 404);
  125. }
  126. // 插入资产流转记录
  127. const [id] = await apiClient.database.table("zichan_trans_log").insert({
  128. ...transferData,
  129. created_at: apiClient.database.fn.now(),
  130. updated_at: apiClient.database.fn.now(),
  131. });
  132. // 获取创建的资产流转记录
  133. const [createdTransferLog] = await apiClient.database
  134. .table("zichan_trans_log as ztl")
  135. .leftJoin("zichan_info as zi", "ztl.asset_id", "zi.id")
  136. .select("ztl.*", "zi.asset_name as asset_name")
  137. .where("ztl.id", id);
  138. // 添加资产信息
  139. createdTransferLog.asset_info = createdTransferLog.asset_name
  140. ? {
  141. id: createdTransferLog.asset_id,
  142. asset_name: createdTransferLog.asset_name,
  143. }
  144. : null;
  145. return c.json({
  146. message: "资产流转记录创建成功",
  147. data: createdTransferLog,
  148. });
  149. } catch (error) {
  150. log.api("创建资产流转记录失败:", error);
  151. return c.json({ error: "创建资产流转记录失败" }, 500);
  152. }
  153. });
  154. // 更新资产流转记录
  155. zichanTransferRoutes.put("/:id", withAuth, async (c) => {
  156. try {
  157. const id = Number(c.req.param("id"));
  158. if (!id || isNaN(id)) {
  159. return c.json({ error: "无效的资产流转记录ID" }, 400);
  160. }
  161. const transferData = (await c.req.json()) as Partial<ZichanTransLog>;
  162. const apiClient = c.get('apiClient');
  163. // 检查资产流转记录是否存在
  164. const [existingTransferLog] = await apiClient.database
  165. .table("zichan_trans_log")
  166. .where({ id, is_deleted: 0 });
  167. if (!existingTransferLog) {
  168. return c.json({ error: "资产流转记录不存在" }, 404);
  169. }
  170. // 如果更新了资产ID,检查资产是否存在
  171. if (
  172. transferData.asset_id &&
  173. transferData.asset_id !== existingTransferLog.asset_id
  174. ) {
  175. const [existingAsset] = await apiClient.database
  176. .table("zichan_info")
  177. .where({ id: transferData.asset_id, is_deleted: 0 });
  178. if (!existingAsset) {
  179. return c.json({ error: "所选资产不存在" }, 404);
  180. }
  181. }
  182. // 更新资产流转记录
  183. await apiClient.database
  184. .table("zichan_trans_log")
  185. .where("id", id)
  186. .update({
  187. ...transferData,
  188. updated_at: apiClient.database.fn.now(),
  189. });
  190. // 获取更新后的资产流转记录
  191. const [updatedTransferLog] = await apiClient.database
  192. .table("zichan_trans_log as ztl")
  193. .leftJoin("zichan_info as zi", "ztl.asset_id", "zi.id")
  194. .select("ztl.*", "zi.asset_name as asset_name")
  195. .where("ztl.id", id);
  196. // 添加资产信息
  197. updatedTransferLog.asset_info = updatedTransferLog.asset_name
  198. ? {
  199. id: updatedTransferLog.asset_id,
  200. asset_name: updatedTransferLog.asset_name,
  201. }
  202. : null;
  203. return c.json({
  204. message: "资产流转记录更新成功",
  205. data: updatedTransferLog,
  206. });
  207. } catch (error) {
  208. log.api("更新资产流转记录失败:", error);
  209. return c.json({ error: "更新资产流转记录失败" }, 500);
  210. }
  211. });
  212. // 删除资产流转记录(软删除)
  213. zichanTransferRoutes.delete("/:id", withAuth, async (c) => {
  214. try {
  215. const id = Number(c.req.param("id"));
  216. if (!id || isNaN(id)) {
  217. return c.json({ error: "无效的资产流转记录ID" }, 400);
  218. }
  219. const apiClient = c.get('apiClient');
  220. // 检查资产流转记录是否存在
  221. const [existingTransferLog] = await apiClient.database
  222. .table("zichan_trans_log")
  223. .where({ id, is_deleted: 0 });
  224. if (!existingTransferLog) {
  225. return c.json({ error: "资产流转记录不存在" }, 404);
  226. }
  227. // 软删除资产流转记录
  228. await apiClient.database.table("zichan_trans_log").where("id", id).update({
  229. is_deleted: 1,
  230. updated_at: apiClient.database.fn.now(),
  231. });
  232. return c.json({
  233. message: "资产流转记录删除成功",
  234. id,
  235. });
  236. } catch (error) {
  237. log.api("删除资产流转记录失败:", error);
  238. return c.json({ error: "删除资产流转记录失败" }, 500);
  239. }
  240. });
  241. return zichanTransferRoutes;
  242. }