wxzc-details.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <template>
  2. <basic-container>
  3. <avue-crud
  4. v-bind="bindVal"
  5. v-on="onEvent"
  6. v-model="form"
  7. :page.sync="page"
  8. :permission="permissionList"
  9. >
  10. <template slot="menuLeft">
  11. <el-button
  12. v-if="!isSelAnnual"
  13. type="danger"
  14. size="small"
  15. icon="el-icon-delete"
  16. plain
  17. @click="handleDelete"
  18. >
  19. 删 除
  20. </el-button>
  21. <el-button
  22. v-if="!isSelAnnual"
  23. type="success"
  24. size="small"
  25. plain
  26. icon="el-icon-upload2"
  27. @click="handleImport"
  28. >
  29. 导入
  30. </el-button>
  31. <el-button
  32. type="warning"
  33. size="small"
  34. plain
  35. icon="el-icon-download"
  36. @click="handleExport"
  37. >
  38. 导出
  39. </el-button>
  40. <el-button
  41. v-if="!isSelAnnual"
  42. type="primary"
  43. size="small"
  44. @click="handleReadyDevData"
  45. >
  46. 直接引用
  47. </el-button>
  48. <print-table-btn @click="printTable" />
  49. </template>
  50. <template slot="body">
  51. <h3 class="page-title">{{ pageTitle }}</h3>
  52. <year-month-select v-model="params.yearAndMonth"></year-month-select>
  53. </template>
  54. <template slot="sysmSearch">
  55. <div style="display: flex; align-items: center;">
  56. <span>使用寿命:</span>
  57. <avue-input-number v-model="extraParams.sysmMin" :min="0" style="width: 90px !important;"></avue-input-number>
  58. <span style="width: 20px; text-align: center;">至</span>
  59. <avue-input-number v-model="extraParams.sysmMax" :min="0" style="width: 90px !important;"></avue-input-number>
  60. </div>
  61. </template>
  62. <template slot="zcyzSearch">
  63. <div style="display: flex; align-items: center;">
  64. <span>资产原值:</span>
  65. <avue-input-number v-model="extraParams.zcyzMin" :min="0" style="width: 90px !important;"></avue-input-number>
  66. <span style="width: 20px; text-align: center;">至</span>
  67. <avue-input-number v-model="extraParams.zcyzMax" :min="0" style="width: 90px !important;"></avue-input-number>
  68. </div>
  69. </template>
  70. <template slot="ysysmSearch">
  71. <div style="display: flex; align-items: center;">
  72. <span>已使用月数:</span>
  73. <avue-input-number v-model="extraParams.ysysmMin" :min="0" style="width: 90px !important;"></avue-input-number>
  74. <span style="width: 20px; text-align: center;">至</span>
  75. <avue-input-number v-model="extraParams.ysysmMax" :min="0" style="width: 90px !important;"></avue-input-number>
  76. </div>
  77. </template>
  78. <template slot="yzjeSearch">
  79. <div style="display: flex; align-items: center;">
  80. <span>月折旧额(每台/套):</span>
  81. <avue-input-number v-model="extraParams.yzjeMin" :min="0" style="width: 90px !important;"></avue-input-number>
  82. <span style="width: 20px; text-align: center;">至</span>
  83. <avue-input-number v-model="extraParams.yzjeMax" :min="0" style="width: 90px !important;"></avue-input-number>
  84. </div>
  85. </template>
  86. <template slot="xmIdForm">
  87. <project-select v-model="form.xmId" :params="{ yearAndMonth: params.yearAndMonth }" :noDetail="true" @change="handleProjectChange"></project-select>
  88. </template>
  89. <template slot="zcbm_formForm">
  90. <asset-select
  91. v-model="form.zcbm_form"
  92. :params="{ yearAndMonth: params.yearAndMonth, zclb: '软件,专利权,非专利技术,其他' }"
  93. valueKey="zcbm"
  94. @change="handleAssetChange"
  95. ></asset-select>
  96. </template>
  97. <template slot="userUnicodeForm">
  98. <el-select
  99. v-model="form.userUnicode"
  100. filterable
  101. placeholder="请选择 使用人"
  102. style="width: 100%;"
  103. >
  104. <el-option
  105. v-for="item in cyPersonList"
  106. :key="item.value"
  107. :label="item.label"
  108. :value="item.value">
  109. </el-option>
  110. </el-select>
  111. </template>
  112. </avue-crud>
  113. <upload-excel-dialog ref="uploadExcelDialog" templateKey="研发资产管理-每月无形资产明细" :uploadAfter="uploadAfter"/>
  114. <WideTablePrinter
  115. ref="printWideTable"
  116. :columns="wideTableColumns"
  117. :data="wideTableData"
  118. :print-title="pageTitle"
  119. :rows-per-page="30"
  120. :default-landscape="true"
  121. :zoom="75"
  122. />
  123. </basic-container>
  124. </template>
  125. <script>
  126. import { fetchDeviceData } from "@/api/yfCostManage/basicDataSetting/wxzcDetail";
  127. import { getList as getCyPersonList } from "@/api/techPerson/cyPersonSumList"
  128. import YearMonthSelect from "@/components/year-month-select";
  129. import UploadExcelDialog from "@/components/upload-excel-dialog";
  130. import projectSelect from "@/components/project-select";
  131. import assetSelect from "@/components/asset-select";
  132. import moment from "moment";
  133. import Decimal from "decimal.js";
  134. import { mapGetters } from "vuex";
  135. import {exportBloByPost} from "@/api/common";
  136. import {getToken} from "@/util/auth";
  137. import {downloadXls} from "@/util/util";
  138. export default window.$crudCommon({
  139. components: {
  140. YearMonthSelect,
  141. projectSelect,
  142. assetSelect,
  143. UploadExcelDialog,
  144. },
  145. data() {
  146. return {
  147. params: {
  148. yearAndMonth: "",
  149. },
  150. isSelAnnual: false,
  151. cyPersonList: [],
  152. wideTableColumns: [],
  153. wideTableData: [],
  154. };
  155. },
  156. watch: {
  157. 'params.yearAndMonth'(newVal) {
  158. if (newVal.length > 4) {
  159. // 是否勾选未全年
  160. this.isSelAnnual = false;
  161. } else {
  162. this.isSelAnnual = true;
  163. }
  164. this.page.currentPage = 1;
  165. this.getList(this.page);
  166. },
  167. },
  168. computed: {
  169. ...mapGetters(['tag']),
  170. permissionList() {
  171. return {
  172. addBtn: !this.isSelAnnual,
  173. editBtn: !this.isSelAnnual,
  174. delBtn: !this.isSelAnnual,
  175. };
  176. },
  177. pageTitle() {
  178. let yearAndMonthCN = '';
  179. if (this.params.yearAndMonth) {
  180. let formatTemp = this.isSelAnnual ? "yyyy年" : "yyyy年MM月";
  181. yearAndMonthCN = moment(this.params.yearAndMonth).format(formatTemp);
  182. }
  183. return `${yearAndMonthCN}${this.tag.label}`.replace(/每月/g, '');
  184. }
  185. },
  186. methods: {
  187. handleImport() {
  188. let excelParams = { yearAndMonth: this.params.yearAndMonth };
  189. this.$refs.uploadExcelDialog.open('/api/kd-scientific/asset/intangible/import', excelParams);
  190. },
  191. uploadAfter() {
  192. this.page.currentPage = 1;
  193. this.getList(this.page);
  194. },
  195. handleExport() {
  196. exportBloByPost(`/api/kd-scientific/asset/intangible/export?${this.website.tokenHeader}=${getToken()}`, this.params).then(res => {
  197. downloadXls(res.data, `${this.pageTitle}.xlsx`);
  198. });
  199. },
  200. /**
  201. * 打印表格
  202. * @param isLandscape 是否横向打印
  203. */
  204. printTable(isLandscape) {
  205. this.wideTableColumns = this.printOption.column;
  206. this.wideTableData = [...this.$refs.crud.list];
  207. this.$nextTick(() => {
  208. this.$refs.printWideTable.printTable(isLandscape);
  209. })
  210. },
  211. handleReadyDevData() {
  212. const _pageLoading = this.getPageLoading("数据读取中,请耐心等待...");
  213. fetchDeviceData({ yearAndMonth: this.params.yearAndMonth}).then(res => {
  214. _pageLoading.close();
  215. let data = res.data;
  216. if (data.success) {
  217. this.$message.success('引用成功!');
  218. this.page.currentPage = 1;
  219. this.getList(this.page);
  220. }
  221. }).catch(err => {
  222. _pageLoading.close();
  223. });
  224. },
  225. handleAssetChange({ assetId }) {
  226. this.form = { ...this.form, assetId };
  227. },
  228. getFormData() {
  229. const { id, xmId, assetId, zcbm_form, userUnicode } = this.form;
  230. let userName;
  231. if (!!userUnicode) {
  232. let personObj = this.cyPersonList.find(item => item.unicode === userUnicode);
  233. userName = personObj ? personObj.name : undefined;
  234. }
  235. return { id, xmId, assetId, zcbm: zcbm_form, userUnicode, userName, yearAndMonth: this.params.yearAndMonth };
  236. },
  237. handleProjectChange(data) {
  238. this.getCyPersonListFunc(data.xmmc);
  239. },
  240. // 获取项目参研人员列表
  241. getCyPersonListFunc(xmmc) {
  242. getCyPersonList(1, 99999, { xmmc, yearAndMonth: this.params.yearAndMonth }).then(({ data }) => {
  243. if (data.code == 200) {
  244. let list = data.data.records && data.data.records.length ? data.data.records[0].technicianList : [];
  245. this.cyPersonList = list.map(item => {
  246. let nameArr = [item.name, item.number || '-', item.idCard || '-'];
  247. return {
  248. label: nameArr.join(' \\ '),
  249. value: item.unicode,
  250. ...item
  251. }
  252. });
  253. }
  254. });
  255. }
  256. },
  257. }, {
  258. // 模块路径
  259. name: 'yfCostManage/basicDataSetting/wxzcDetail',
  260. res: ({ data }) => {
  261. data.records = data.records.map(item => {
  262. item.zcbm_form = item.zcbm;
  263. item.zcmc = item.asset ? item.asset.zcmc : '';
  264. item.zclb = item.asset ? item.asset.zclb : '';
  265. item.gl = item.asset ? item.asset.gl : '';
  266. item.yt = item.asset ? item.asset.yt : '';
  267. item.kssj = item.asset ? item.asset.kssj : '';
  268. item.sysm = item.asset ? item.asset.sysm : '';
  269. item.ysysm = item.asset ? item.asset.ysysm : '';
  270. item.zcyz = item.asset ? item.asset.zcyz : '';
  271. item.jcz = item.asset ? new Decimal(item.asset.jcz || 0).mul(new Decimal(100)) : '';
  272. item.yzje = item.asset ? item.asset.yzje : '';
  273. item.status = item.asset ? item.asset.status : '';
  274. return item;
  275. });
  276. console.log(data.records)
  277. return data;
  278. },
  279. });
  280. </script>