index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. <template>
  2. <div class="p-2">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="mb-[10px]">
  5. <el-card shadow="hover" :style="{ height: '70px' }">
  6. <el-row :gutter="20" align="middle">
  7. <!-- 节目总数 -->
  8. <el-col :span="6" style="display: flex; justify-content: center; align-items: center">
  9. <el-statistic :value="totalNum">
  10. <template #title>
  11. <div style="display: inline-flex; align-items: center">总发布数</div>
  12. </template>
  13. </el-statistic>
  14. </el-col>
  15. <!-- 轮播总数 -->
  16. <el-col :span="6" style="display: flex; justify-content: center; align-items: center">
  17. <el-statistic :value="lbNum">
  18. <template #title>
  19. <div style="display: inline-flex; align-items: center">轮播组发布</div>
  20. </template>
  21. </el-statistic>
  22. </el-col>
  23. <!-- 节目总数 -->
  24. <el-col :span="6" style="display: flex; justify-content: center; align-items: center">
  25. <el-statistic :value="jmNum">
  26. <template #title>
  27. <div style="display: inline-flex; align-items: center">分屏组发布</div>
  28. </template>
  29. </el-statistic>
  30. </el-col>
  31. <!-- 素材总数 -->
  32. <el-col :span="6" style="display: flex; justify-content: center; align-items: center">
  33. <el-statistic :value="scNum">
  34. <template #title>
  35. <div style="display: inline-flex; align-items: center">素材发布</div>
  36. </template>
  37. </el-statistic>
  38. </el-col>
  39. </el-row>
  40. </el-card>
  41. <el-card shadow="hover" :style="{ marginTop: '10px', height: '60px' }">
  42. <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="50px">
  43. <el-form-item label="名称" prop="name">
  44. <el-input v-model="queryParams.name" style="width: 150px" placeholder="请输入名称" clearable @keyup.enter="handleQuery" />
  45. </el-form-item>
  46. <el-form-item label="类型" prop="itemType">
  47. <el-select v-model="queryParams.itemType" style="width: 150px" placeholder="请选择类型" clearable>
  48. <el-option v-for="dict in smsb_push_type" :key="dict.value" :label="dict.label" :value="dict.value" />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="时间" style="width: 250px">
  52. <el-date-picker
  53. v-model="dateRangeCreateTime"
  54. value-format="YYYY-MM-DD HH:mm:ss"
  55. type="daterange"
  56. range-separator="-"
  57. start-placeholder="开始日期"
  58. end-placeholder="结束日期"
  59. :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
  60. />
  61. </el-form-item>
  62. <el-form-item>
  63. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  64. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  65. <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['source:itemPush:add']">新增 </el-button>
  66. <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['source:itemPush:edit']"
  67. >修改
  68. </el-button>
  69. <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['source:itemPush:remove']"
  70. >删除
  71. </el-button>
  72. <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['source:itemPush:export']">导出 </el-button>
  73. </el-form-item>
  74. </el-form>
  75. </el-card>
  76. </div>
  77. </transition>
  78. <el-card shadow="never">
  79. <el-table v-loading="loading" :data="itemPushList" @selection-change="handleSelectionChange">
  80. <el-table-column type="selection" width="55" align="center" />
  81. <el-table-column label="主键ID" align="left" prop="id" width="180" v-if="true" />
  82. <el-table-column label="名称" align="left" prop="name" />
  83. <el-table-column label="优先级" align="center" width="100" prop="level">
  84. <template #default="scope">
  85. <dict-tag :options="smsb_push_level" :value="scope.row.level" />
  86. </template>
  87. </el-table-column>
  88. <el-table-column label="类型" align="center" width="100" prop="itemType">
  89. <template #default="scope">
  90. <dict-tag :options="smsb_push_type" :value="scope.row.itemType" />
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="审核状态" align="center" width="100" prop="status">
  94. <template #default="scope">
  95. <dict-tag :options="smsb_push_state" :value="scope.row.status" />
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="创建时间" align="left" prop="createTime" width="180" />
  99. <el-table-column label="创建人" align="left" prop="createUser" width="180" :show-overflow-tooltip="true" />
  100. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
  101. <template #default="scope">
  102. <el-tooltip content="修改" placement="top">
  103. <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['source:itemPush:edit']"></el-button>
  104. </el-tooltip>
  105. <el-tooltip content="删除" placement="top">
  106. <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['source:itemPush:remove']"></el-button>
  107. </el-tooltip>
  108. <!-- <el-tooltip content="提交审核" placement="top">
  109. <el-button link type="primary" icon="Top" @click="handleReview(scope.row)" v-hasPermi="['source:minioData:add']"></el-button>
  110. </el-tooltip>-->
  111. <el-tooltip content="下发详情" placement="top">
  112. <el-button link type="primary" icon="List" @click="handleDevice(scope.row)" v-hasPermi="['source:itemPush:edit']"></el-button>
  113. </el-tooltip>
  114. <el-tooltip content="下架" placement="top">
  115. <el-button
  116. link
  117. type="primary"
  118. icon="Bottom"
  119. v-if="scope.row.status == 'finish'"
  120. @click="handleRemoveItem(scope.row)"
  121. v-hasPermi="['source:itemPush:edit']"
  122. ></el-button>
  123. </el-tooltip>
  124. </template>
  125. </el-table-column>
  126. </el-table>
  127. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
  128. </el-card>
  129. <!-- 添加或修改内容发布对话框 -->
  130. <el-dialog :title="dialog.title" v-model="dialog.visible" width="1500px" append-to-body>
  131. <el-row :gutter="20" style="height: 100%; display: flex">
  132. <!--设备列表-->
  133. <el-col :span="6" style="height: 100%; overflow: auto; border-right: 1px solid #eee; padding-right: 10px">
  134. <el-table v-loading="loading" :data="deviceList" @selection-change="handleSelectDevice">
  135. <el-table-column type="selection" width="55" align="center" />
  136. <el-table-column label="设备名称" align="left" prop="name" :show-overflow-tooltip="true" />
  137. </el-table>
  138. </el-col>
  139. <!--发布名称-->
  140. <el-col :span="10" style="height: 100%; overflow: auto; padding-left: 10px">
  141. <el-form ref="itemPushFormRef" :model="form" :rules="rules" label-width="60px">
  142. <el-form-item label="名称" prop="name">
  143. <el-input v-model="form.name" placeholder="请输入名称" />
  144. </el-form-item>
  145. <el-row>
  146. <el-col :span="12">
  147. <el-form-item label="类型" prop="itemType">
  148. <el-select v-model="form.itemType" placeholder="请选择类型" @change="getItemList">
  149. <el-option v-for="dict in smsb_push_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"></el-option>
  150. </el-select>
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="12">
  154. <el-form-item label="优先级" prop="level">
  155. <el-select v-model="form.level" placeholder="请选择优先级">
  156. <el-option v-for="dict in smsb_push_level" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"></el-option>
  157. </el-select>
  158. </el-form-item>
  159. </el-col>
  160. </el-row>
  161. <el-form-item label="日期" prop="dateRange">
  162. <el-date-picker
  163. v-model="form.dateRange"
  164. value-format="YYYY-MM-DD"
  165. type="daterange"
  166. range-separator="-"
  167. start-placeholder="开始日期"
  168. end-placeholder="结束日期"
  169. :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
  170. />
  171. </el-form-item>
  172. <!-- Days of the Week -->
  173. <el-form-item label="每周">
  174. <el-checkbox-group v-model="form.weekDays">
  175. <el-checkbox label="0">日</el-checkbox>
  176. <el-checkbox label="1">一</el-checkbox>
  177. <el-checkbox label="2">二</el-checkbox>
  178. <el-checkbox label="3">三</el-checkbox>
  179. <el-checkbox label="4">四</el-checkbox>
  180. <el-checkbox label="5">五</el-checkbox>
  181. <el-checkbox label="6">六</el-checkbox>
  182. </el-checkbox-group>
  183. </el-form-item>
  184. <!-- Time Periods -->
  185. <el-form-item label="时间">
  186. <div v-for="(timePeriod, index) in form.timeRange" :key="index" class="time-period">
  187. <el-time-picker v-model="timePeriod.start" placeholder="开始时间" format="HH:mm:ss" :disabled="false" />
  188. <span>至</span>
  189. <el-time-picker v-model="timePeriod.end" placeholder="结束时间" format="HH:mm:ss" :disabled="false" />
  190. <el-button @click="removeTimePeriod(index)" type="danger" icon="Delete"></el-button>
  191. </div>
  192. <el-button @click="addTimePeriod" type="primary">新增时间段</el-button>
  193. </el-form-item>
  194. </el-form>
  195. </el-col>
  196. <!--发布内容-->
  197. <el-col :span="8" style="height: 100%; overflow: auto; padding-left: 10px">
  198. <!--轮播组-->
  199. <div v-if="form.itemType === 1 || form.itemType === 2">
  200. <!--<el-table v-loading="loading" :data="itemList" @selection-change="handleSelectItem">
  201. <el-table-column type="selection" width="55" align="center" />-->
  202. <el-table v-loading="loading" :data="itemList">
  203. <el-table-column label="ID" width="200" align="left" :show-overflow-tooltip="true">
  204. <template #default="{ row }">
  205. <el-radio v-model="selectedRowId" :label="row.id" @change="handleRadioChange(row)" />
  206. </template>
  207. </el-table-column>
  208. <el-table-column label="名称" align="left" prop="itemName" :show-overflow-tooltip="true" />
  209. <el-table-column label="资源数量" align="center" prop="sourceNum" width="80" />
  210. <!--
  211. <el-table-column label="创建人" align="left" prop="createUser" width="100" :show-overflow-tooltip="true" />
  212. -->
  213. </el-table>
  214. </div>
  215. </el-col>
  216. </el-row>
  217. <template #footer>
  218. <div class="dialog-footer">
  219. <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
  220. <el-button @click="cancel">取 消</el-button>
  221. </div>
  222. </template>
  223. </el-dialog>
  224. <!-- 下发详情弹窗 -->
  225. <el-dialog :title="deviceDialog.title" v-model="deviceDialog.visible" width="900px" append-to-body>
  226. <!--发布名称-->
  227. <div>
  228. <el-form ref="itemPushFormRef" :model="form" :rules="rules" label-width="70px">
  229. <el-form-item label="发布名称" prop="name">
  230. <el-input v-model="form.name" style="width: 500px" placeholder="请输入名称" :disabled="true" />
  231. </el-form-item>
  232. <el-row>
  233. <el-col :span="12">
  234. <el-form-item label="发布类型" prop="itemType">
  235. <el-select v-model="form.itemType" placeholder="请选择类型" @change="getItemList" :disabled="true">
  236. <el-option v-for="dict in smsb_push_type" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"></el-option>
  237. </el-select>
  238. </el-form-item>
  239. </el-col>
  240. <el-col :span="12">
  241. <el-form-item label="优先级" prop="level">
  242. <el-select v-model="form.level" placeholder="请选择优先级" :disabled="true">
  243. <el-option v-for="dict in smsb_push_level" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"></el-option>
  244. </el-select>
  245. </el-form-item>
  246. </el-col>
  247. </el-row>
  248. </el-form>
  249. </div>
  250. <!--设备列表-->
  251. <el-button type="primary" v-if="removeItemTag" icon="Bottom" :disabled="removeButtonTag" @click="handleDoRemoveItem()"> 下架 </el-button>
  252. <el-table v-loading="deviceLoading" :data="pushDeviceList" style="height: 500px; margin-top: 10px" @selection-change="handleDeviceSelectionChange">
  253. <el-table-column type="selection" v-if="removeItemTag" width="55" align="center" />
  254. <el-table-column label="设备名称" align="left" prop="deviceName" :show-overflow-tooltip="true" />
  255. <el-table-column label="发布排序" align="center" prop="sortNum" width="100" :show-overflow-tooltip="true" />
  256. <el-table-column label="发布状态" align="center" prop="pushState" width="120" :show-overflow-tooltip="true">
  257. <template #default="scope">
  258. <dict-tag :options="smsb_push_device_state" :value="scope.row.pushState" />
  259. </template>
  260. </el-table-column>
  261. <el-table-column label="发布时间" align="left" prop="createTime" width="170" :show-overflow-tooltip="true" />
  262. <el-table-column label="操作" v-if="removeItemTag" align="center" class-name="small-padding fixed-width" width="150">
  263. <template #default="scope">
  264. <el-tooltip content="下架" placement="top">
  265. <el-button link type="primary" icon="Bottom" @click="handleDoRemoveItem(scope.row)" v-hasPermi="['source:itemPush:edit']"></el-button>
  266. </el-tooltip>
  267. </template>
  268. </el-table-column>
  269. </el-table>
  270. <template #footer>
  271. <div class="dialog-footer">
  272. <el-button @click="cancel">取 消</el-button>
  273. </div>
  274. </template>
  275. </el-dialog>
  276. </div>
  277. </template>
  278. <script setup name="ItemPush" lang="ts">
  279. import { listItemPush, getItemPush, delItemPush, addItemPush, updateItemPush, pushStatistics, reviewItemPush } from '@/api/smsb/source/item_push';
  280. import { ItemPushVO, ItemPushQuery, ItemPushForm } from '@/api/smsb/source/item_push_type';
  281. import { DeviceQuery, DeviceVO } from '@/api/smsb/device/device_type';
  282. import { listDevice } from '@/api/smsb/device/device';
  283. import { ItemQuery, ItemVO } from '@/api/smsb/source/item_type';
  284. import { listItem } from '@/api/smsb/source/item';
  285. import { ItemPushDeviceVO } from '@/api/smsb/source/item_push_device_type';
  286. import { listItemPushDeviceV2, removeItemPushDevice } from '@/api/smsb/source/item_push_device';
  287. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  288. const { smsb_push_state, smsb_push_device_state, smsb_push_type, smsb_push_level } = toRefs<any>(
  289. proxy?.useDict('smsb_push_state', 'smsb_push_device_state', 'smsb_push_type', 'smsb_push_level')
  290. );
  291. const itemPushList = ref<ItemPushVO[]>([]);
  292. const itemList = ref<ItemVO[]>([]);
  293. const buttonLoading = ref(false);
  294. const loading = ref(true);
  295. const deviceLoading = ref(true);
  296. const showSearch = ref(true);
  297. const ids = ref<Array<string | number>>([]);
  298. const removePushId = ref<number | string>();
  299. const removeIds = ref<Array<string | number>>([]);
  300. const deviceIds = ref<Array<string | number>>([]);
  301. const itemIds = ref<Array<string | number>>([]);
  302. const single = ref(true);
  303. const multiple = ref(true);
  304. const total = ref(0);
  305. const deviceTotal = ref(0);
  306. const itemTotal = ref(0);
  307. const totalNum = ref(0);
  308. const lbNum = ref(0);
  309. const jmNum = ref(0);
  310. const scNum = ref(0);
  311. const dateRangeCreateTime = ref<[DateModelType, DateModelType]>(['', '']);
  312. const deviceList = ref<DeviceVO[]>([]);
  313. const pushDeviceList = ref<ItemPushDeviceVO[]>([]);
  314. // 存储选中行的唯一标识
  315. const selectedRowId = ref<number | null>(null);
  316. const removeItemTag = ref(false);
  317. const removeButtonTag = ref(true);
  318. const queryFormRef = ref<ElFormInstance>();
  319. const itemPushFormRef = ref<ElFormInstance>();
  320. const dialog = reactive<DialogOption>({
  321. visible: false,
  322. title: ''
  323. });
  324. const deviceDialog = reactive<DialogOption>({
  325. visible: false,
  326. title: ''
  327. });
  328. const initFormData: ItemPushForm = {
  329. name: undefined,
  330. level: undefined,
  331. itemType: undefined,
  332. deviceIds: undefined,
  333. itemIds: undefined,
  334. dateRange: undefined,
  335. weekDays: ['0', '1', '2', '3', '4', '5', '6'],
  336. timeRange: []
  337. };
  338. const data = reactive<PageData<ItemPushForm, ItemPushQuery>>({
  339. form: { ...initFormData },
  340. queryParams: {
  341. pageNum: 1,
  342. pageSize: 10,
  343. name: undefined,
  344. level: undefined,
  345. itemType: undefined,
  346. status: undefined,
  347. params: {
  348. createTime: undefined
  349. }
  350. },
  351. rules: {}
  352. });
  353. const dialogData = reactive<DialogPageData<DeviceQuery>>({
  354. dialogQueryParams: {
  355. pageNum: 1,
  356. pageSize: 10,
  357. pushId: undefined
  358. }
  359. });
  360. const itemData = reactive<TransPageData<ItemQuery>>({
  361. transQueryParams: {
  362. pageNum: 1,
  363. pageSize: 10,
  364. itemType: undefined
  365. }
  366. });
  367. const { queryParams, form, rules } = toRefs(data);
  368. const { dialogQueryParams } = toRefs(dialogData);
  369. const { transQueryParams } = toRefs(itemData);
  370. const getStatistics = async () => {
  371. const res = await pushStatistics();
  372. console.log(res.data);
  373. totalNum.value = res.data.totalNum;
  374. lbNum.value = res.data.lbNum;
  375. jmNum.value = res.data.jmNum;
  376. scNum.value = res.data.scNum;
  377. };
  378. /** 查询内容发布列表 */
  379. const getList = async () => {
  380. loading.value = true;
  381. queryParams.value.params = {};
  382. proxy?.addDateRange(queryParams.value, dateRangeCreateTime.value, 'CreateTime');
  383. const res = await listItemPush(queryParams.value);
  384. itemPushList.value = res.rows;
  385. total.value = res.total;
  386. loading.value = false;
  387. };
  388. /** 查询设备列表 */
  389. const getDeviceList = async () => {
  390. const res = await listDevice(dialogQueryParams.value);
  391. deviceList.value = res.rows;
  392. deviceTotal.value = res.total;
  393. loading.value = false;
  394. };
  395. const getItemList = async () => {
  396. transQueryParams.value.itemType = form.value.itemType;
  397. if (form.value.itemType === 1 || form.value.itemType === 2) {
  398. const res = await listItem(transQueryParams.value);
  399. itemList.value = res.rows;
  400. itemTotal.value = res.total;
  401. }
  402. };
  403. const addTimePeriod = () => {
  404. const now = new Date();
  405. now.setHours(0, 0, 0, 0);
  406. form.value.timeRange.push({ start: new Date(now), end: new Date(now) });
  407. };
  408. const removeTimePeriod = (index: number) => {
  409. form.value.timeRange.splice(index, 1);
  410. };
  411. /** 取消按钮 */
  412. const cancel = () => {
  413. reset();
  414. dialog.visible = false;
  415. deviceDialog.visible = false;
  416. };
  417. /** 表单重置 */
  418. const reset = () => {
  419. form.value = { ...initFormData };
  420. itemPushFormRef.value?.resetFields();
  421. };
  422. /** 搜索按钮操作 */
  423. const handleQuery = () => {
  424. queryParams.value.pageNum = 1;
  425. getList();
  426. };
  427. const handleDevice = async (row?: ItemPushVO) => {
  428. removeItemTag.value = false;
  429. const pushId = row.id;
  430. deviceDialog.title = '发布详情';
  431. deviceDialog.visible = true;
  432. dialogQueryParams.value.pushId = pushId;
  433. dialogQueryParams.value.pageSize = 1000;
  434. pushDeviceList.value = [];
  435. const pushInfo = await getItemPush(pushId);
  436. Object.assign(form.value, pushInfo.data);
  437. await getItemDeviceList(pushId);
  438. };
  439. const handleRemoveItem = async (row?: ItemPushVO) => {
  440. removeItemTag.value = true;
  441. removeButtonTag.value = true;
  442. removeIds.value = [];
  443. const pushId = row.id;
  444. deviceDialog.title = '内容下架';
  445. deviceDialog.visible = true;
  446. dialogQueryParams.value.pushId = pushId;
  447. removePushId.value = pushId;
  448. dialogQueryParams.value.pageSize = 1000;
  449. pushDeviceList.value = [];
  450. const pushInfo = await getItemPush(pushId);
  451. Object.assign(form.value, pushInfo.data);
  452. await getItemDeviceList(pushId);
  453. };
  454. const handleDoRemoveItem = async (row?: ItemPushDeviceVO) => {
  455. const deviceIds = Array<number | string>();
  456. if (null != row) {
  457. deviceIds.push(row.deviceId);
  458. }
  459. if (removeIds.value.length > 0) {
  460. removeIds.value.forEach((deviceId) => {
  461. deviceIds.push(deviceId);
  462. });
  463. }
  464. const removeParam = {
  465. pushId: removePushId.value,
  466. deviceIds: deviceIds
  467. };
  468. await removeItemPushDevice(removeParam);
  469. await getItemDeviceList(removePushId.value);
  470. };
  471. const getItemDeviceList = async (pushId: number | string) => {
  472. deviceLoading.value = true;
  473. dialogQueryParams.value.pushId = pushId;
  474. const res = await listItemPushDeviceV2(dialogQueryParams.value);
  475. pushDeviceList.value = res.rows;
  476. deviceTotal.value = res.total;
  477. deviceLoading.value = false;
  478. };
  479. /** 重置按钮操作 */
  480. const resetQuery = () => {
  481. dateRangeCreateTime.value = ['', ''];
  482. queryFormRef.value?.resetFields();
  483. handleQuery();
  484. };
  485. /** 多选框选中数据 */
  486. const handleSelectionChange = (selection: ItemPushVO[]) => {
  487. ids.value = selection.map((item) => item.id);
  488. single.value = selection.length != 1;
  489. multiple.value = !selection.length;
  490. };
  491. const handleDeviceSelectionChange = (selection: ItemPushDeviceVO[]) => {
  492. removeIds.value = selection.map((item) => item.deviceId);
  493. removeButtonTag.value = removeIds.value.length == 0;
  494. };
  495. /** 多选框选中数据 */
  496. const handleSelectDevice = (selection: DeviceVO[]) => {
  497. deviceIds.value = selection.map((item) => item.id);
  498. form.value.deviceIds = deviceIds.value;
  499. };
  500. const handleSelectItem = (selection: ItemVO[]) => {
  501. itemIds.value = selection.map((item) => item.id);
  502. form.value.itemIds = itemIds.value;
  503. };
  504. const handleRadioChange = (row: ItemVO) => {
  505. const itemIds = [row.id];
  506. form.value.itemIds = itemIds;
  507. };
  508. /** 新增按钮操作 */
  509. const handleAdd = () => {
  510. reset();
  511. dialog.visible = true;
  512. dialog.title = '添加内容发布';
  513. getDeviceList();
  514. };
  515. /** 修改按钮操作 */
  516. const handleUpdate = async (row?: ItemPushVO) => {
  517. reset();
  518. const _id = row?.id || ids.value[0];
  519. const res = await getItemPush(_id);
  520. Object.assign(form.value, res.data);
  521. dialog.visible = true;
  522. dialog.title = '修改内容发布';
  523. getDeviceList();
  524. };
  525. /** 提交按钮 */
  526. const submitForm = () => {
  527. itemPushFormRef.value?.validate(async (valid: boolean) => {
  528. if (valid) {
  529. buttonLoading.value = true;
  530. if (form.value.id) {
  531. await updateItemPush(form.value).finally(() => (buttonLoading.value = false));
  532. } else {
  533. await addItemPush(form.value).finally(() => (buttonLoading.value = false));
  534. }
  535. proxy?.$modal.msgSuccess('操作成功');
  536. dialog.visible = false;
  537. await getList();
  538. }
  539. });
  540. };
  541. /** 删除按钮操作 */
  542. const handleDelete = async (row?: ItemPushVO) => {
  543. const _ids = row?.id || ids.value;
  544. await proxy?.$modal.confirm('是否确认删除内容发布编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
  545. await delItemPush(_ids);
  546. proxy?.$modal.msgSuccess('删除成功');
  547. await getList();
  548. };
  549. const handleReview = async (row?: ItemPushVO) => {
  550. const id = row?.id;
  551. if (row.status !== 'draft') {
  552. proxy?.$modal.msgError('只有未提交状态可以提交审核');
  553. return;
  554. }
  555. await proxy?.$modal.confirm('是否确认提交审核名称为"' + row.name + '"的数据项?').finally(() => (loading.value = false));
  556. await reviewItemPush(id);
  557. proxy?.$modal.msgSuccess('提交成功');
  558. await getList();
  559. };
  560. /** 导出按钮操作 */
  561. const handleExport = () => {
  562. proxy?.download(
  563. 'source/itemPush/export',
  564. {
  565. ...queryParams.value
  566. },
  567. `itemPush_${new Date().getTime()}.xlsx`
  568. );
  569. };
  570. onMounted(() => {
  571. getList();
  572. getStatistics();
  573. });
  574. </script>
  575. <style scoped>
  576. .time-period {
  577. display: flex;
  578. align-items: center;
  579. margin-bottom: 10px;
  580. }
  581. .time-period span {
  582. margin: 0 10px;
  583. }
  584. .dialog-footer {
  585. text-align: right;
  586. }
  587. </style>