sourceMappings.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <AidopDemoShell title="来源映射维护" subtitle="库位角色和岗位由页面改动后记为 MANUAL,自动分类不会覆盖。">
  3. <el-tabs v-model="tab">
  4. <el-tab-pane label="来源归属" name="domain">
  5. <p class="hint">这张表回答「一个来源加源侧组织标识,物理上落在哪个租户的贴源区」。它不回答某条业务数据属于哪个租户。同一范围已被别的租户占用时,保存会被拒绝。</p>
  6. <el-form :inline="true">
  7. <el-form-item label="租户"><el-input v-model="tenantId" style="width: 200px" /></el-form-item>
  8. <el-form-item label="系统码"><el-input v-model="domainForm.systemCode" /></el-form-item>
  9. <el-form-item label="组织标识"><el-input v-model="domainForm.domain" placeholder="账套或 domain" /></el-form-item>
  10. <el-form-item><el-button type="primary" @click="saveDomain">保存</el-button></el-form-item>
  11. </el-form>
  12. <el-table :data="domains" border>
  13. <el-table-column prop="systemCode" label="系统码" />
  14. <el-table-column prop="domain" label="组织标识" />
  15. <el-table-column prop="tenantId" label="落地租户" />
  16. <el-table-column prop="remark" label="备注" />
  17. </el-table>
  18. </el-tab-pane>
  19. <el-tab-pane label="库位角色" name="loc">
  20. <el-form :inline="true">
  21. <el-form-item label="租户"><el-input v-model="tenantId" style="width: 200px" /></el-form-item>
  22. <el-form-item><el-checkbox v-model="unknownOnly">只看 UNKNOWN</el-checkbox></el-form-item>
  23. <el-form-item><el-button type="primary" @click="loadLoc">查询</el-button></el-form-item>
  24. <el-form-item><el-button @click="saveLoc">保存为 MANUAL</el-button></el-form-item>
  25. </el-form>
  26. <el-table :data="locations" border>
  27. <el-table-column prop="domain" label="domain" width="120" />
  28. <el-table-column prop="location" label="库位" />
  29. <el-table-column label="角色">
  30. <template #default="{ row }">
  31. <el-select v-model="row.locationRole" filterable>
  32. <el-option v-for="r in roles" :key="r" :label="r" :value="r" />
  33. </el-select>
  34. </template>
  35. </el-table-column>
  36. <el-table-column prop="roleSource" label="来源" width="120" />
  37. </el-table>
  38. </el-tab-pane>
  39. <el-tab-pane label="岗位映射" name="pos">
  40. <el-button type="primary" @click="loadPos">查询</el-button>
  41. <el-button @click="savePos">保存为 MANUAL</el-button>
  42. <el-table :data="positions" border class="mt">
  43. <el-table-column prop="sourceSystem" label="来源" width="160" />
  44. <el-table-column prop="srcPositionRaw" label="源岗位" />
  45. <el-table-column label="岗位码">
  46. <template #default="{ row }"><el-input v-model="row.positionCode" /></template>
  47. </el-table-column>
  48. </el-table>
  49. </el-tab-pane>
  50. <el-tab-pane label="事务类型" name="tx">
  51. <el-form :inline="true">
  52. <el-form-item label="系统码"><el-input v-model="txQuery" /></el-form-item>
  53. <el-form-item><el-button type="primary" @click="loadTx">查询</el-button></el-form-item>
  54. </el-form>
  55. <el-form :inline="true">
  56. <el-form-item label="源码"><el-input v-model="txForm.srcTransCode" /></el-form-item>
  57. <el-form-item label="阶段码"><el-input v-model="txForm.stageCode" /></el-form-item>
  58. <el-form-item><el-button type="primary" @click="saveTx">新增全局行</el-button></el-form-item>
  59. </el-form>
  60. <el-table :data="txs" border>
  61. <el-table-column prop="systemCode" label="系统码" width="180" />
  62. <el-table-column prop="srcTransCode" label="源码" />
  63. <el-table-column prop="qtySign" label="方向" width="80" />
  64. <el-table-column prop="locationRole" label="库位角色" />
  65. <el-table-column prop="stageCode" label="阶段码" />
  66. </el-table>
  67. </el-tab-pane>
  68. </el-tabs>
  69. </AidopDemoShell>
  70. </template>
  71. <script setup lang="ts" name="aidopDataPlatformSourceMappings">
  72. import { reactive, ref } from 'vue';
  73. import { ElMessage } from 'element-plus';
  74. import AidopDemoShell from '../components/AidopDemoShell.vue';
  75. import service from '/@/utils/request';
  76. const tab = ref('domain');
  77. const roles = ['MAT_INSPECT', 'MATERIAL', 'MAT_LINE_LOC', 'SEMI', 'FG_INSPECT', 'FG', 'FG_LINE_LOC', 'REJECT_SCRAP', 'VMI', 'OTHER', 'UNKNOWN'];
  78. const tenantId = ref(localStorage.getItem('aidop-tenant-id') || '');
  79. const unknownOnly = ref(false);
  80. const domains = ref<any[]>([]);
  81. const locations = ref<any[]>([]);
  82. const positions = ref<any[]>([]);
  83. const txs = ref<any[]>([]);
  84. const txQuery = ref('');
  85. const domainForm = reactive({ systemCode: '', domain: '' });
  86. const txForm = reactive({ srcTransCode: '', stageCode: '' });
  87. function listOf(res: any) {
  88. const data = res?.data ?? res;
  89. return Array.isArray(data) ? data : data?.list ?? [];
  90. }
  91. async function saveDomain() {
  92. await service.put('/api/DataPlatform/source-domain-maps', {
  93. tenantId: Number(tenantId.value),
  94. systemCode: domainForm.systemCode,
  95. domain: domainForm.domain,
  96. });
  97. ElMessage.success('已保存');
  98. domains.value = listOf(await service.get('/api/DataPlatform/source-domain-maps', { params: { tenantId: tenantId.value } }));
  99. }
  100. async function loadLoc() {
  101. locations.value = listOf(
  102. await service.get('/api/DataPlatform/location-roles', {
  103. params: { tenantId: tenantId.value, unknownOnly: unknownOnly.value },
  104. })
  105. );
  106. }
  107. async function saveLoc() {
  108. await service.put('/api/DataPlatform/location-roles', {
  109. tenantId: Number(tenantId.value),
  110. rows: locations.value.map((r) => ({
  111. domain: r.domain,
  112. location: r.location,
  113. locationRole: r.locationRole,
  114. })),
  115. });
  116. ElMessage.success('已保存');
  117. await loadLoc();
  118. }
  119. async function loadPos() {
  120. positions.value = listOf(
  121. await service.get('/api/DataPlatform/position-maps', { params: { tenantId: tenantId.value, unknownOnly: unknownOnly.value } })
  122. );
  123. }
  124. async function savePos() {
  125. await service.put('/api/DataPlatform/position-maps', {
  126. tenantId: Number(tenantId.value),
  127. rows: positions.value.map((r) => ({
  128. sourceSystem: r.sourceSystem,
  129. domain: r.domain,
  130. srcPositionRaw: r.srcPositionRaw,
  131. srcPositionField: r.srcPositionField,
  132. positionCode: r.positionCode,
  133. })),
  134. });
  135. ElMessage.success('已保存');
  136. await loadPos();
  137. }
  138. async function loadTx() {
  139. txs.value = listOf(await service.get('/api/DataPlatform/trans-type-maps', { params: { systemCode: txQuery.value } }));
  140. }
  141. async function saveTx() {
  142. await service.put('/api/DataPlatform/trans-type-maps', {
  143. systemCode: txQuery.value,
  144. srcTransCode: txForm.srcTransCode,
  145. stageCode: txForm.stageCode,
  146. qtySign: 0,
  147. locationRole: '',
  148. isStage: 1,
  149. });
  150. ElMessage.success('已保存');
  151. await loadTx();
  152. }
  153. </script>
  154. <style scoped>
  155. .hint { color: var(--el-text-color-secondary); margin-bottom: 12px; }
  156. .mt { margin-top: 12px; }
  157. </style>