addCaseModal.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <template>
  2. <BasicModal
  3. class="resultListTab"
  4. v-bind="$attrs"
  5. @register="register"
  6. title="新增案件"
  7. @visible-change="handleVisibleChange"
  8. @ok="handleSubmit"
  9. :confirmLoading="loading"
  10. :width="900"
  11. :min-height="0"
  12. >
  13. <div class="pt-2px pr-3px">
  14. <div class="mx-5 BasicForm flex">
  15. <span style="line-height: 32px; margin-right: 10px">案件名称</span>
  16. <div class="input">
  17. <a-input
  18. style="width: 600px"
  19. maxlength="100"
  20. showCount
  21. v-model:value="fileFlow.caseTitle"
  22. placeholder="请输入"
  23. />
  24. </div>
  25. <!-- <a-button type="primary" @click="handleAdd"> 新增</a-button> -->
  26. </div>
  27. <BasicTable class="zdyform" @register="registerTable">
  28. <template #tableTitle>
  29. <a-tabs class="resultListTab" v-model:activeKey="sceneType" @change="changeTable">
  30. <Tabs.TabPane :key="0" tab="实景三维" />
  31. <Tabs.TabPane :key="1" tab="共享实景三维" />
  32. <Tabs.TabPane :key="2" tab="多元融合" />
  33. <Tabs.TabPane :key="3" tab="共享多元融合" />
  34. <!-- <Tabs.TabPane :key="3" tab="多元融合共享" /> -->
  35. </a-tabs>
  36. </template>
  37. <template #href="{ record }">
  38. <a
  39. v-if="record.fusionTitle"
  40. target="_blank"
  41. :title="record.fusionTitle"
  42. :href="`/code/index.html?caseId=${record.fusionId}#/show`"
  43. >{{ record.fusionTitle || record.title }}</a
  44. >
  45. <a
  46. v-else-if="record.status == 1 || (record.status == -2 && record.payStatus == 1)"
  47. target="_blank"
  48. :title="record.sceneName"
  49. :href="record.webSite"
  50. >{{ record.sceneName }}</a
  51. >
  52. <span v-else-if="record.sceneName">{{ record.sceneName }}</span>
  53. <span v-else>-</span>
  54. </template>
  55. </BasicTable>
  56. </div>
  57. </BasicModal>
  58. </template>
  59. <script lang="ts">
  60. import { defineComponent, ref, nextTick, onMounted, reactive, h } from 'vue';
  61. import { BasicModal, useModalInner } from '/@/components/Modal';
  62. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  63. import { useMessage } from '/@/hooks/web/useMessage';
  64. import { sceneMove } from '/@/api/operate';
  65. import { sceneColumns, diversityColumns } from './data';
  66. import { useI18n } from '/@/hooks/web/useI18n';
  67. import { Tabs } from 'ant-design-vue';
  68. import { getByKey, addOrUpdate, del } from '/@/api/media';
  69. import {
  70. BasicTable,
  71. useTable,
  72. TableAction,
  73. BasicColumn,
  74. TableImg,
  75. FormProps,
  76. } from '/@/components/Table';
  77. import { caseaddOrUpdateApi, operateAddSceneList } from '/@/api/operate';
  78. const { t } = useI18n();
  79. export default defineComponent({
  80. components: { BasicModal, BasicTable, TableAction, [Tabs.name]: Tabs },
  81. props: {
  82. userData: { type: Object },
  83. },
  84. emits: ['update', 'register'],
  85. setup(props, { emit }) {
  86. const modelRef = ref({});
  87. const loading = ref(false);
  88. const sceneType = ref(0);
  89. const fileFlow = reactive({
  90. caseTitle: '',
  91. file: null,
  92. dylist: [],
  93. mslist: [],
  94. fusionIds: [],
  95. });
  96. const searchForm: Partial<FormProps> = {
  97. labelWidth: 60,
  98. autoSubmitOnEnter: true,
  99. autoAdvancedLine: 1,
  100. schemas: [
  101. {
  102. field: 'sceneName',
  103. label: '名称',
  104. component: 'Input',
  105. componentProps: {
  106. maxLength: 100,
  107. placeholder: ' 请名称搜索',
  108. },
  109. colProps: {
  110. xl: 7,
  111. xxl: 7,
  112. },
  113. },
  114. ],
  115. };
  116. const { createMessage, createConfirm } = useMessage();
  117. const [registerTable, { reload, getForm, setSelectedRowKeys, setPagination, setColumns }] =
  118. useTable({
  119. api: operateAddSceneList,
  120. title: ``,
  121. showTableSetting: false,
  122. rowSelection: {
  123. type: 'checkbox',
  124. getCheckboxProps: getRowSelection,
  125. onChange: onSelectChange,
  126. },
  127. // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
  128. columns: sceneColumns,
  129. searchInfo: { isObj: '1', sceneType: sceneType },
  130. useSearchForm: true,
  131. formConfig: searchForm,
  132. immediate: false,
  133. showIndexColumn: false,
  134. rowKey: 'num',
  135. beforeFetch: (T) => {
  136. T.fusionTitle = T.sceneName;
  137. return T;
  138. },
  139. afterFetch: listAfterFetch,
  140. fetchSetting: {
  141. pageField: 'pageNum',
  142. sizeField: 'pageSize',
  143. listField: 'list',
  144. totalField: 'total',
  145. },
  146. canResize: true,
  147. });
  148. onMounted(() => {});
  149. let addListFunc = () => {};
  150. const [register, { closeModal }] = useModalInner((data) => {
  151. console.log(data);
  152. getForm().resetFields();
  153. reload();
  154. data && onDataReceive(data);
  155. });
  156. function getRowSelection(record) {
  157. return {
  158. disabled: !(record.fusionId || record.status == 1 || record.status == -2 ), // Column configuration not to be checked
  159. name: record.name,
  160. };
  161. }
  162. function onSelectChange(selectedRowKeys: any, selectedRows: any) {
  163. console.log('selectedRowKeys changed: ', selectedRowKeys, selectedRows, sceneType.value);
  164. let fusionIds = [], dylist = [], mslist = [];
  165. selectedRows.map(ele => {
  166. if(ele.fusionId){
  167. fusionIds.push(ele.fusionId);
  168. }else{
  169. mslist.push(ele.num)
  170. }
  171. })
  172. fileFlow.fusionIds = fusionIds;
  173. fileFlow.dylist = dylist;
  174. fileFlow.mslist = mslist;
  175. }
  176. function onDataReceive(data) {
  177. sceneType.value = 0;
  178. fileFlow.caseTitle = '';
  179. modelRef.value = data;
  180. fileFlow.dylist = [];
  181. fileFlow.mslist = [];
  182. fileFlow.fusionIds = [];
  183. fileFlow.caseTitle = '';
  184. setSelectedRowKeys([]);
  185. }
  186. function handleAdd() {
  187. console.log('handleAdd', fileFlow.dictName);
  188. let params = {
  189. dictName: fileFlow.dictName.trim(),
  190. };
  191. if (!fileFlow.dictName.trim()) {
  192. return createMessage.warning('请输入名称');
  193. }
  194. addOrUpdate(params).then((res) => {
  195. createMessage.success('添加成功');
  196. fileFlow.dictName = '';
  197. reload();
  198. });
  199. }
  200. const handleSubmit = async () => {
  201. if (!fileFlow.caseTitle?.trim()) {
  202. return createMessage.warning('请输入案件名称');
  203. }
  204. if (fileFlow.mslist.length == 0 && fileFlow.fusionIds.length == 0) {
  205. return createMessage.warning('至少选择一个场景或者多元融合');
  206. }
  207. try {
  208. loading.value = true;
  209. const apiData = {
  210. caseTitle: fileFlow.caseTitle?.trim(),
  211. sceneNumParam: [
  212. {
  213. type: 0,
  214. numList: fileFlow.dylist,
  215. },
  216. {
  217. type: 1,
  218. numList: fileFlow.mslist,
  219. },
  220. {
  221. type: 2,
  222. numList: fileFlow.fusionIds,
  223. },
  224. ],
  225. };
  226. console.log('res', apiData);
  227. const res = await caseaddOrUpdateApi(apiData);
  228. console.log('res', res);
  229. closeModal();
  230. createMessage.success('新增案件成功。');
  231. sceneType.value = 0;
  232. emit('update');
  233. loading.value = false;
  234. } catch (error) {
  235. loading.value = false;
  236. console.log('not passing', error);
  237. }
  238. };
  239. function handleVisibleChange(v) {
  240. // console.log(v);
  241. // v && props.userData && nextTick(() => onDataReceive(props.userData));
  242. }
  243. function changeTable(params) {
  244. console.log(params, 'changeTable', sceneType.value);
  245. setColumns(sceneType.value == 2 || sceneType.value == 3 ? diversityColumns : sceneColumns);
  246. setPagination({ current: 1 });
  247. reload();
  248. }
  249. function listAfterFetch(list) {
  250. console.log(list, 'changeTable', sceneType.value);
  251. return list.map(ele => {
  252. if(!ele.num){
  253. ele.num = ele.fusionId;
  254. }
  255. return ele;
  256. });
  257. }
  258. async function handleDelete(record: Recordable) {
  259. console.log('handleDelete', record);
  260. createConfirm({
  261. title: '删除',
  262. content: '确定要删除吗?',
  263. onOk: async () => {
  264. del({ id: record.id }).then(() => {
  265. createMessage.success({
  266. content: '删除成功',
  267. });
  268. reload();
  269. });
  270. },
  271. });
  272. }
  273. return {
  274. register,
  275. handleAdd,
  276. registerTable,
  277. model: modelRef,
  278. fileFlow,
  279. sceneType,
  280. changeTable,
  281. handleVisibleChange,
  282. handleSubmit,
  283. addListFunc,
  284. handleDelete,
  285. t,
  286. loading,
  287. };
  288. },
  289. });
  290. </script>
  291. <style lang="less">
  292. .resultListTab {
  293. .ant-tabs-nav {
  294. margin: 0;
  295. }
  296. }
  297. .zdyform {
  298. .vben-basic-form {
  299. margin: 0;
  300. }
  301. }
  302. </style>