workOrders.ts 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. import type { VariablesContext } from "../middlewares.ts";
  2. import { WorkflowEngine } from "../utils/workflow_engine.ts";
  3. export async function createWorkOrder(c: VariablesContext) {
  4. try {
  5. const apiClient = c.get('apiClient');
  6. const orderData = await c.req.json();
  7. const [id] = await apiClient.database.table('work_orders').insert({
  8. ...orderData,
  9. status: 'pending',
  10. created_at: apiClient.database.fn.now(),
  11. updated_at: apiClient.database.fn.now()
  12. });
  13. const [order] = await apiClient.database.table('work_orders')
  14. .where('id', id)
  15. .select();
  16. return c.json({ data: order });
  17. } catch (error) {
  18. return c.json({ error: "创建工作单失败" }, 500);
  19. }
  20. }
  21. export async function getWorkOrders(c: VariablesContext) {
  22. try {
  23. const apiClient = c.get('apiClient');
  24. const { status, assigneeId } = c.req.query();
  25. let query = apiClient.database.table('work_orders');
  26. if (status) {
  27. query = query.where('status', status);
  28. }
  29. if (assigneeId) {
  30. query = query.where('assignee_id', assigneeId);
  31. }
  32. const orders = await query.select();
  33. return c.json({ data: orders });
  34. } catch (error) {
  35. return c.json({ error: "获取工作单列表失败" }, 500);
  36. }
  37. }
  38. export async function getWorkOrderDetail(c: VariablesContext) {
  39. try {
  40. const apiClient = c.get('apiClient');
  41. const { id } = c.req.param();
  42. const [order] = await apiClient.database.table('work_orders')
  43. .where('id', id)
  44. .select();
  45. if (!order) {
  46. return c.json({ error: 'Work order not found' }, 404);
  47. }
  48. return c.json({ data: order });
  49. } catch (error) {
  50. return c.json({ error: "获取工作单详情失败" }, 500);
  51. }
  52. }
  53. export async function updateWorkOrder(c: VariablesContext) {
  54. try {
  55. const apiClient = c.get('apiClient');
  56. const { id } = c.req.param();
  57. const updateData = await c.req.json();
  58. await apiClient.database.table('work_orders')
  59. .where('id', id)
  60. .update({
  61. ...updateData,
  62. updated_at: apiClient.database.fn.now()
  63. });
  64. const [order] = await apiClient.database.table('work_orders')
  65. .where('id', id)
  66. .select();
  67. return c.json({ data: order });
  68. } catch (error) {
  69. return c.json({ error: "更新工作单失败" }, 500);
  70. }
  71. }
  72. export async function changeWorkOrderStatus(c: VariablesContext) {
  73. try {
  74. const apiClient = c.get('apiClient');
  75. const { id } = c.req.param();
  76. const { status, comment } = await c.req.json();
  77. const user = c.get('user');
  78. if (!user || typeof user !== 'object' || !('id' in user) || !('roles' in user)) {
  79. return c.json({ error: "未授权访问" }, 401);
  80. }
  81. const userRoles = String(user.roles).split(',');
  82. const workOrderId = parseInt(id);
  83. const userId = Number(user.id);
  84. // 获取当前工单状态
  85. const [order] = await apiClient.database.table('work_orders')
  86. .where('id', id)
  87. .select();
  88. if (!order) {
  89. return c.json({ error: '工单不存在' }, 404);
  90. }
  91. // 初始化工作流引擎
  92. const workflow = new WorkflowEngine(c);
  93. // 检查状态流转是否允许
  94. const canTransition = await workflow.canTransition(
  95. order.status,
  96. status,
  97. userRoles
  98. );
  99. if (!canTransition) {
  100. return c.json({
  101. error: `不允许从${order.status}状态变更为${status}状态`
  102. }, 403);
  103. }
  104. // 更新工单状态
  105. const updateData: Record<string, any> = {
  106. status,
  107. updated_at: apiClient.database.fn.now()
  108. };
  109. // 如果是关闭操作,记录关闭人和关闭时间
  110. if (status === 'closed') {
  111. updateData.closer_id = userId;
  112. updateData.close_time = apiClient.database.fn.now();
  113. }
  114. await apiClient.database.table('work_orders')
  115. .where('id', id)
  116. .update(updateData);
  117. // 记录状态变更历史
  118. await workflow.logStatusChange(
  119. parseInt(id),
  120. order.status,
  121. status,
  122. Number(user.id),
  123. comment
  124. );
  125. // 记录流程操作历史
  126. if (status === 'closed') {
  127. await apiClient.database.table('work_order_process_history').insert({
  128. work_order_id: workOrderId,
  129. action_type: 'close',
  130. operator_id: userId,
  131. operate_time: apiClient.database.fn.now(),
  132. comment
  133. });
  134. }
  135. // 检查超时状态
  136. await workflow.checkTimeout(parseInt(id));
  137. return c.json({ data: { success: true } });
  138. } catch (error) {
  139. console.error('状态变更失败:', error);
  140. return c.json({ error: "更新工作单状态失败" }, 500);
  141. }
  142. }
  143. export async function getWorkOrderStatusHistory(c: VariablesContext) {
  144. try {
  145. const apiClient = c.get('apiClient');
  146. const { id } = c.req.param();
  147. const history = await apiClient.database.table('work_order_status_history')
  148. .where('work_order_id', id)
  149. .orderBy('created_at', 'desc')
  150. .select();
  151. return c.json({ data: history });
  152. } catch (error) {
  153. return c.json({ error: "获取状态历史失败" }, 500);
  154. }
  155. }
  156. export async function assignWorkOrder(c: VariablesContext) {
  157. try {
  158. const apiClient = c.get('apiClient');
  159. const { id } = c.req.param();
  160. const { assigneeId, comment } = await c.req.json();
  161. const user = c.get('user');
  162. if (!user || typeof user !== 'object' || !('id' in user)) {
  163. return c.json({ error: "未授权访问" }, 401);
  164. }
  165. const userId = Number(user.id);
  166. // 获取当前工单信息
  167. const [order] = await apiClient.database.table('work_orders')
  168. .where('id', id)
  169. .select();
  170. if (!order) {
  171. return c.json({ error: '工单不存在' }, 404);
  172. }
  173. const isReassign = order.assignee_id !== null;
  174. const updateData: Record<string, any> = {
  175. assignee_id: assigneeId,
  176. updated_at: apiClient.database.fn.now()
  177. };
  178. if (isReassign) {
  179. updateData.reassignee_id = userId;
  180. updateData.reassign_time = apiClient.database.fn.now();
  181. } else {
  182. updateData.assign_time = apiClient.database.fn.now();
  183. }
  184. await apiClient.database.table('work_orders')
  185. .where('id', id)
  186. .update(updateData);
  187. // 记录流程操作历史
  188. await apiClient.database.table('work_order_process_history').insert({
  189. work_order_id: parseInt(id),
  190. action_type: isReassign ? 'reassign' : 'assign',
  191. operator_id: userId,
  192. operate_time: apiClient.database.fn.now(),
  193. comment
  194. });
  195. return c.json({ data: { success: true } });
  196. } catch (error) {
  197. return c.json({ error: "分配工作单失败" }, 500);
  198. }
  199. }
  200. export async function getWorkflowDetails(c: VariablesContext) {
  201. try {
  202. const apiClient = c.get('apiClient');
  203. const { id } = c.req.param();
  204. // 获取工单基本信息
  205. const [order] = await apiClient.database.table('work_orders')
  206. .where('id', id)
  207. .select();
  208. if (!order) {
  209. return c.json({ error: '工单不存在' }, 404);
  210. }
  211. // 获取流程历史记录
  212. const processHistory = await apiClient.database.table('work_order_process_history')
  213. .where('work_order_id', id)
  214. .orderBy('operate_time', 'desc')
  215. .select();
  216. // 获取状态变更历史
  217. const statusHistory = await apiClient.database.table('work_order_status_history')
  218. .where('work_order_id', id)
  219. .orderBy('change_time', 'desc')
  220. .select();
  221. return c.json({
  222. data: {
  223. ...order,
  224. processHistory,
  225. statusHistory
  226. }
  227. });
  228. } catch (error) {
  229. return c.json({ error: "获取工单流程详情失败" }, 500);
  230. }
  231. }
  232. export async function getWorkOrderSettings(c: VariablesContext) {
  233. try {
  234. const apiClient = c.get('apiClient');
  235. const settings = await apiClient.database.table('work_order_settings')
  236. .select();
  237. return c.json({ data: settings });
  238. } catch (error) {
  239. return c.json({ error: "获取工作单设置失败" }, 500);
  240. }
  241. }
  242. export async function updateWorkOrderSettings(c: VariablesContext) {
  243. try {
  244. const apiClient = c.get('apiClient');
  245. const settings = await c.req.json();
  246. await apiClient.database.table('work_order_settings')
  247. .update(settings);
  248. return c.json({ data: { success: true } });
  249. } catch (error) {
  250. return c.json({ error: "更新工作单设置失败" }, 500);
  251. }
  252. }