index.vue 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283
  1. <template>
  2. <div>
  3. <!-- 左侧树形结构和右侧表格 -->
  4. <el-row :gutter="20">
  5. <!-- 左侧树形结构 -->
  6. <el-col :span="3">
  7. <div style="marginTop:20px;margin-left: 10px;">
  8. <el-tree
  9. :data="goodsTypeData"
  10. v-model="getGoodsListParm.parammaps.goodsTypeId"
  11. :props="defaultProps"
  12. @node-click="handleNodeClick"
  13. :disabled="false"
  14. ></el-tree>
  15. </div>
  16. </el-col>
  17. <!-- 右侧表格和表单 -->
  18. <el-col :span="21">
  19. <!-- 搜索条件 -->
  20. <div class="app-container">
  21. <tree-select
  22. v-model="getGoodsListParm.parammaps.goodsTypeId"
  23. class="typeSelect"
  24. :height="300"
  25. :width="250"
  26. clearable
  27. :data="goodsTypeData1"
  28. :placeholder="placeholder"
  29. style="display: inline-block"
  30. :default-props="defaultProps"
  31. :node-key="nodeKey"
  32. :checked-keys="defaultCheckedKeys"
  33. @popoverHide="popoverHide"
  34. :disabled="false"
  35. />
  36. <el-input
  37. v-model="getGoodsListParm.parammaps.goodsName"
  38. placeholder="货品名称"
  39. clearable
  40. style="width: 120px"
  41. class="filter-item"
  42. />
  43. <el-input
  44. v-model="getGoodsListParm.parammaps.goodsCode"
  45. placeholder="货品编码"
  46. clearable
  47. style="width: 120px"
  48. class="filter-item"
  49. />
  50. <el-input
  51. v-model="getGoodsListParm.parammaps.goodsSpecification"
  52. placeholder="货品规格"
  53. clearable
  54. style="width: 120px"
  55. class="filter-item"
  56. />
  57. <el-select
  58. v-model="getGoodsListParm.parammaps.goodsEnabled"
  59. clearable
  60. placeholder="货品状态"
  61. class="filter-item"
  62. style="width: 120px"
  63. >
  64. <el-option
  65. v-for="item in statuesList"
  66. :key="item.id"
  67. :label="item.name"
  68. :value="item.id"
  69. />
  70. </el-select>
  71. <el-date-picker
  72. ref="inputDatetime2"
  73. v-model="getGoodsListParm.parammaps.inputDatetime2"
  74. class="inputDatetime"
  75. type="daterange"
  76. style="width: 250px; top: -3px"
  77. format="yyyy-MM-dd"
  78. value-format="yyyy-MM-dd"
  79. range-separator="至"
  80. start-placeholder="开始日期"
  81. end-placeholder="结束日期"
  82. />
  83. <el-button
  84. v-waves
  85. class="search-button"
  86. type="primary"
  87. icon="el-icon-search"
  88. @click="form_search"
  89. >搜索</el-button>
  90. </div>
  91. <!-- 操作按钮 -->
  92. <div class="search-button-container">
  93. <el-button
  94. class="search-button"
  95. type="primary"
  96. icon="el-icon-circle-plus"
  97. @click="form_add"
  98. >新增</el-button>
  99. <el-button
  100. class="search-button"
  101. type="primary"
  102. style="background-color: #aaaaaa;"
  103. icon="el-icon-s-order"
  104. @click="template_excel"
  105. >模板</el-button>
  106. <el-upload
  107. style="display: inline-block"
  108. :headers="headers"
  109. :data="uploadData"
  110. :action="uploadExcelUrl"
  111. :show-file-list="false"
  112. :before-upload="beforeImportExcel"
  113. :on-success="handleImportExcelSuccess"
  114. >
  115. <el-button
  116. v-waves
  117. class="search-button-upload"
  118. type="primary"
  119. style="background-color: #ffaa00;"
  120. icon="el-icon-upload2"
  121. >导入</el-button>
  122. </el-upload>
  123. <el-button
  124. class="search-button"
  125. type="primary"
  126. style="background-color: #00ff15;"
  127. icon="el-icon-upload2"
  128. @click="derive_data"
  129. >导出</el-button>
  130. </div>
  131. <!-- 表格 -->
  132. <el-table
  133. :key="tableKey"
  134. v-loading="listLoading"
  135. element-loading-text="给我一点时间"
  136. :data="list"
  137. border
  138. fit
  139. highlight-current-row
  140. style="width: 100%;margin-left: 20px;"
  141. :row-style="rowStyle"
  142. :cell-style="cellStyle"
  143. class="elTable table-fixed"
  144. :max-height="myHeight"
  145. >
  146. <el-table-column label="序号" align="center" type="index" width="50px">
  147. <template slot-scope="scope">
  148. <span>{{ scope.$index + (pageNum - 1) * pageSize + 1 }}</span>
  149. </template>
  150. </el-table-column>
  151. <el-table-column label="货品类别" align="center" prop="goodsTypeName" />
  152. <el-table-column label="货品名称" align="center" prop="goodsName" />
  153. <el-table-column label="货品编号" align="center" prop="goodsCode" />
  154. <el-table-column label="货品规格" align="center" prop="goodsSpecification" />
  155. <el-table-column label="计量单位" align="center" prop="goodsUnit" />
  156. <el-table-column label="录入日期" align="center" prop="createTime" />
  157. <el-table-column label="录入人" align="center" prop="createrName" />
  158. <el-table-column label="货品图片" align="center">
  159. <template slot-scope="scope">
  160. <el-popover placement="right" title="" trigger="hover">
  161. <img
  162. slot="reference"
  163. :src="scope.row.goodsImagePath"
  164. style="height: 100px; width: 100px"
  165. />
  166. <!-- 悬停时显示的内容 -->
  167. <img
  168. :src="scope.row.goodsImagePath"
  169. style="height: 200px; width: 200px"
  170. />
  171. </el-popover>
  172. </template>
  173. </el-table-column>
  174. <el-table-column label="货品状态" align="center">
  175. <template slot-scope="scope">
  176. <el-switch
  177. v-model="scope.row.goodsEnabled"
  178. :active-value="0"
  179. :inactive-value="1"
  180. active-color="#13ce66"
  181. inactive-color="#ff4949"
  182. @change="handleSwitchChange(scope.$index, scope.row)"
  183. />
  184. </template>
  185. </el-table-column>
  186. <el-table-column label="操作" min-width="150px" header-align="center" align="center">
  187. <template slot-scope="scope">
  188. <el-button type="primary" size="mini" @click="handleGet(scope.row)">查看</el-button>
  189. <el-button type="primary" size="mini" @click="handleEdit(scope.row)">编辑</el-button>
  190. <el-button type="primary" size="mini" @click="handleDel(scope.row)">删除</el-button>
  191. </template>
  192. </el-table-column>
  193. </el-table>
  194. <!-- 分页 -->
  195. <pagination
  196. v-show="total >= 0"
  197. :total="total"
  198. :page.sync="getGoodsListParm.offset"
  199. :limit.sync="getGoodsListParm.pagecount"
  200. @pagination="get_goods_data"
  201. />
  202. </el-col>
  203. </el-row>
  204. <!-- 弹窗 -->
  205. <el-dialog
  206. :title="dialogTitle"
  207. :visible.sync="dialogFormVisible"
  208. :close-on-click-modal="false"
  209. @close="handleCancel"
  210. :style="{ maxHeight: '100vh', overflowY: 'auto' }"
  211. >
  212. <div class="app-add">
  213. <el-form
  214. :rules="rules"
  215. :inline="true"
  216. :model="formLabelAlign"
  217. label-position="left"
  218. label-width="auto"
  219. style="width: 90%; margin: 0 auto 30px"
  220. >
  221. <el-row :gutter="24">
  222. <el-col :span="8">
  223. <el-form-item label="货品类别:" prop="typea">
  224. <tree-select
  225. class="typeSelect"
  226. :height="300"
  227. :width="160"
  228. size="small"
  229. clearable
  230. :data="goodsTypeData"
  231. :placeholder="placeholder"
  232. :default-props="defaultProps"
  233. :node-key="nodeKey"
  234. :checked-keys="defaultCheckedKeys"
  235. @popoverHide="popoverHideAdd"
  236. :disabled="isView"
  237. />
  238. </el-form-item>
  239. </el-col>
  240. <el-col :span="8">
  241. <el-form-item label="货品编号:" prop="goodsCode">
  242. <el-input
  243. v-model="formLabelAlign.goodsCode"
  244. placeholder="请输入货品编号"
  245. :disabled="isView || !formLabelAlign.goodsTypeId"
  246. />
  247. </el-form-item>
  248. </el-col>
  249. <el-col :span="8">
  250. <el-form-item label="货品名称:" prop="goodsName">
  251. <el-input
  252. v-model="formLabelAlign.goodsName"
  253. placeholder="请输入货品名称"
  254. :disabled="isView"
  255. />
  256. </el-form-item>
  257. </el-col>
  258. </el-row>
  259. <el-row :gutter="24">
  260. <el-col :span="8">
  261. <el-form-item label="货品规格:" >
  262. <el-input
  263. v-model="formLabelAlign.goodsSpecification"
  264. placeholder="请输入货品规格"
  265. :disabled="isView"
  266. />
  267. </el-form-item>
  268. </el-col>
  269. <el-col :span="8">
  270. <el-form-item label="货品型号:" >
  271. <el-input
  272. v-model="formLabelAlign.goodsModel"
  273. placeholder="请输入货品型号"
  274. :disabled="isView"
  275. />
  276. </el-form-item>
  277. </el-col>
  278. <el-col :span="8">
  279. <el-form-item label="计量单位:">
  280. <el-select v-model="formLabelAlign.goodsUnit" placeholder="请选择" :disabled="isView" clearable style="width: 187px">
  281. <el-option
  282. v-for="item in measureList"
  283. :key="item.id"
  284. :label="item.name"
  285. :value="item.id">
  286. </el-option>
  287. </el-select>
  288. </el-form-item>
  289. </el-col>
  290. </el-row>
  291. <el-row :gutter="24">
  292. <el-col :span="8">
  293. <el-form-item label="用途:">
  294. <el-input
  295. v-model="formLabelAlign.purpose"
  296. placeholder="请输入用途"
  297. :disabled="isView"
  298. />
  299. </el-form-item>
  300. </el-col>
  301. <el-col :span="8">
  302. <el-form-item label=" 录入人:">
  303. <el-select v-model="formLabelAlign.createrId" placeholder="请选择" :disabled="isView" clearable style="width: 187px">
  304. <el-option
  305. v-for="item in empList"
  306. :key="item.id"
  307. :label="item.name"
  308. :value="item.id">
  309. </el-option>
  310. </el-select>
  311. </el-form-item>
  312. </el-col>
  313. <el-col :span="8">
  314. <el-form-item label="录入日期:">
  315. <el-date-picker
  316. style="width: 187px"
  317. v-model="formLabelAlign.date"
  318. type="date"
  319. format="yyyy-MM-dd"
  320. :disabled="isView"
  321. value-format="yyyy-MM-dd"
  322. placeholder="选择日期">
  323. </el-date-picker>
  324. </el-form-item>
  325. </el-col>
  326. </el-row>
  327. <el-row :gutter="24">
  328. <el-col :span="8">
  329. <el-form-item label="备注:">
  330. <el-input
  331. v-model="formLabelAlign.remarks"
  332. placeholder="请输入备注"
  333. :disabled="isView"
  334. />
  335. </el-form-item>
  336. </el-col>
  337. </el-row>
  338. <!-- <div> -->
  339. <el-row :gutter="24">
  340. <el-form-item label="货品图片:">
  341. <el-upload id="uploadPic"
  342. :action="uploadImageUrl"
  343. :limit='1'
  344. :file-list="fileList"
  345. list-type="picture-card"
  346. :on-preview="handlePictureCardPreview"
  347. :on-change="(file, fileList) => handlePicChange(file, fileList)"
  348. :on-success="(response, file, fileList) => handlePicSuccess(response, file, fileList)"
  349. :headers="headers"
  350. :disabled="isView"
  351. :on-remove="(file, fileList) => handlePicRemove(file, fileList)"
  352. >
  353. <i slot="default" class="el-icon-plus"></i>
  354. </el-upload>
  355. <el-dialog :visible.sync="dialogVisible">
  356. <img width="100%" :src="dialogImageUrl" alt="">
  357. </el-dialog>
  358. </el-form-item>
  359. </el-form-item>
  360. </el-col>
  361. </el-row>
  362. <el-table
  363. :key="tableKey"
  364. v-loading="listLoading"
  365. element-loading-text="给我一点时间"
  366. :data="list"
  367. border
  368. fit
  369. highlight-current-row
  370. style="width: 100%;margin-left: 20px;"
  371. :row-style="rowStyle"
  372. :cell-style="cellStyle"
  373. class="elTable table-fixed"
  374. :max-height="myHeight"
  375. >
  376. <el-table-column
  377. label="序号"
  378. align="center"
  379. type="index"
  380. width="50px"
  381. />
  382. </el-table>
  383. <!-- </div> -->
  384. </el-form>
  385. </div>
  386. <div slot="footer" class="dialog-footer">
  387. <el-button class="add-button" v-if="!isEdit && isShow" style="background-color: #13ce66;" @click="handleAdd">保存并新增</el-button>
  388. <el-button class="add-button" v-if="!isEdit && isShow" @click="handleAddAndOff">保存并关闭</el-button>
  389. <el-button class="add-button" v-if="!isEdit && isShow" style="background-color: #ffffff; color: black;" @click="handleCancel">取消并关闭</el-button>
  390. <el-button class="add-button" v-if="isEdit" @click="handleEditAndOff">保存并关闭</el-button>
  391. <el-button class="add-button" v-if="isEdit" style="background-color: #ffffff; color: black;" @click="handleCancel">取消并关闭</el-button>
  392. </div>
  393. </el-dialog>
  394. </div>
  395. </template>
  396. <!-- <el-form ref="form" label-position="top" :rules="rules" label-width="80px" :model="formLabelAlign">
  397. <el-form-item label="资产编号" prop="assetCode" style="display: flex; align-items: center;">
  398. <el-input v-model="formLabelAlign.assetCode"></el-input>
  399. </el-form-item>
  400. </el-form> -->
  401. <script>
  402. import { PostDataByName, ExecDataByConfig, failproccess, GetDataByName, transData } from '@/api/common';
  403. import TreeSelect from '@/components/TreeSelect'; // 确保路径正确
  404. import Pagination from '@/components/Pagination'
  405. import waves from '@/directive/waves'
  406. import { MessageBox } from 'element-ui'
  407. import { getToken } from '@/utils/auth'
  408. import 'element-ui/lib/theme-chalk/index.css';
  409. import Cookies from 'js-cookie'
  410. export default {
  411. inject: ['reload'],
  412. name: 'Basics',
  413. components: { Pagination, TreeSelect },
  414. directives: { waves },
  415. data() {
  416. return {
  417. rules: { goodsCode: [
  418. { required: true, message: '货品编码不能为空', trigger: 'blur' },
  419. ],
  420. uploadData: {
  421. name: 'importDiesel',
  422. importParams: '牧场,油卡编号,设备名称,设备编号,加油日期,加油量(升),单价,加油人,录入人,柴油类型,备注',
  423. sheetname: 'SheetJS'
  424. },
  425. goodsName: [
  426. { required: true, message: '货品名称不能为空', trigger: 'blur' },
  427. ],
  428. goodsSpecification: [
  429. { required: true, message: '货品规格不能为空', trigger: 'blur' },
  430. ],
  431. goodsUnit: [
  432. { required: true, message: '货品单位不能为空', trigger: 'blur' },
  433. ],
  434. typea : [
  435. { required: true, message: '货品分类不能为空', trigger: 'blur' },
  436. ],
  437. },
  438. total: 0,
  439. dialogImageUrl: '',
  440. dialogVisible: false,
  441. uploadImageUrl: process.env.VUE_APP_BASE_API + 'authdata/uploaderimage',
  442. uploadExcelUrl: process.env.VUE_APP_BASE_API + 'authdata/GoodsExcel',
  443. //图片请求头
  444. headers: { optname: 'insertcustompic', id: 1,token: getToken()},
  445. getDictList :{name:"getDictListSelect",parammaps:{pid:"75"}},
  446. fileList: [],
  447. statuesList: [
  448. { id: '0', name: '启用' },
  449. { id: '1', name: '禁用' }
  450. ],
  451. measureList:[],
  452. pageNum: 0,
  453. pageSize: 0,
  454. isView : false,
  455. isEdit : false,
  456. nodeKey: 'id',
  457. disabled: false, // 是否禁用
  458. listLoading: true,
  459. isShow: false,
  460. myHeight: document.documentElement.clientHeight - 85 - 250,
  461. rowStyle: { maxHeight: 50 + 'px', height: 45 + 'px' },
  462. cellStyle: { padding: 0 + 'px' },
  463. tableKey :0,
  464. list: [],//数据列表
  465. defaultCheckedKeys: [], // 默认选中 的节点
  466. getGoodsListParm:{name:'getGoodsList' ,page: 1,offset: 1, returntype: 'Map', pagecount: 7, parammaps:{ goodsTypeId:''}},
  467. getEmployeesSelectParm :{name:'getEmployeesSelect'},
  468. updateGoodsStatusByIdParm : {  name: "updateGoodsStatusById", returntype: "Map",  parammaps: {goodsEnabled: 0, id: 0 } },
  469. empList :[],
  470. placeholder: '请选择设备分类',
  471. deleteGoodsParm:{name: 'deleteGoods',parammaps:{ id:''}},
  472. getGoodsTypeParm: { name: 'GetGoodsTypeList' },
  473. goodsTypeData:[],
  474. goodsTypeData1:[],
  475. formLabelAlign :{ goodsTypeId: '',
  476. goodsCode: ''},
  477. dialogTitle : '',
  478. dialogFormVisible: false,
  479. defaultProps: {
  480. children: 'children',
  481. label: 'goodsTypeName'
  482. }
  483. };
  484. },
  485. methods: {
  486. buildInsertRequest() {
  487. return {
  488. common: { returnmap: "0" },
  489. data: [
  490. {
  491. name: "CheckGoodsNameUniqueOnInsert",
  492. type: "v",
  493. parammaps: { goodsName: this.formLabelAlign.goodsName }, // 动态绑定 goodsName
  494. },
  495. {
  496. name: "CheckGoodsCodeUniqueOnInsert",
  497. type: "v",
  498. parammaps: { goodsCode: this.formLabelAlign.goodsCode }, // 动态绑定 goodsCode
  499. },
  500. {
  501. name: "InsertGoods",
  502. type: "e",
  503. parammaps: {
  504. goodsTypeId: this.formLabelAlign.goodsTypeId,
  505. goodsCode: this.formLabelAlign.goodsCode,
  506. goodsName: this.formLabelAlign.goodsName,
  507. goodsSpecification: this.formLabelAlign.goodsSpecification,
  508. goodsModel: this.formLabelAlign.goodsModel,
  509. goodsUnit: this.formLabelAlign.goodsUnit,
  510. createrId: this.formLabelAlign.createrId,
  511. remarks: this.formLabelAlign.remarks,
  512. goodsImage: this.formLabelAlign.goodsImage || "0",
  513. goodsEnabled:0,
  514. purpose: this.formLabelAlign.purpose || "",
  515. createTime: this.formLabelAlign.date,
  516. },
  517. },
  518. ],
  519. };
  520. },
  521. buildUpdateRequest() {
  522. return {
  523. common: { returnmap: "0" },
  524. data: [
  525. {
  526. name: "CheckGoodsNameUniqueOnUpdate",
  527. type: "v",
  528. parammaps: {
  529. goodsName: this.formLabelAlign.goodsName, // 动态绑定 goodsName
  530. id: this.formLabelAlign.id, // 动态绑定 id
  531. },
  532. },
  533. {
  534. name: "CheckGoodsCodeUniqueOnUpdate",
  535. type: "v",
  536. parammaps: {
  537. goodsCode: this.formLabelAlign.goodsCode, // 动态绑定 goodsCode
  538. id: this.formLabelAlign.id, // 动态绑定 id
  539. },
  540. },
  541. {
  542. name: "updateGoods",
  543. type: "e",
  544. parammaps: {
  545. id: this.formLabelAlign.id, // 动态绑定 id
  546. goodsTypeId: this.formLabelAlign.goodsTypeId,
  547. goodsCode: this.formLabelAlign.goodsCode,
  548. goodsName: this.formLabelAlign.goodsName,
  549. goodsSpecification: this.formLabelAlign.goodsSpecification,
  550. goodsModel: this.formLabelAlign.goodsModel,
  551. goodsUnit: this.formLabelAlign.goodsUnit,
  552. remarks: this.formLabelAlign.remarks,
  553. goodsImage: this.formLabelAlign.goodsImage || "0", // 默认值为 "0"
  554. goodsEnabled: this.formLabelAlign.goodsEnabled || "1", // 默认值为 "1"
  555. },
  556. },
  557. ],
  558. };
  559. },
  560. resetInsertForm() {
  561. // 重置 formLabelAlign 数据
  562. this.formLabelAlign = {
  563. goodsTypeId: '', // 商品类别 ID
  564. goodsCode: '', // 商品编码
  565. goodsName: '', // 商品名称
  566. goodsSpecification: '', // 商品规格
  567. goodsModel: '', // 商品型号
  568. goodsUnit: '', // 商品单位
  569. createrId: '', // 创建人 ID
  570. remarks: '', // 备注
  571. goodsImage: '0', // 商品图片
  572. goodsEnabled: '1', // 商品状态(默认启用)
  573. purpose: '', // 用途
  574. picture: '', // 图片
  575. };
  576. this.fileList= [];
  577. },
  578. handleEditAndOff(){
  579. this.handleEdit1();
  580. this.dialogFormVisible = false;
  581. },
  582. handleEdit1(){
  583. const code = this.formLabelAlign.goodsUnit;
  584. const id = this.formLabelAlign.goodsUnitId;
  585. console.log("goodsCode : ",code);
  586. console.log("goodsTypeId : ",id);
  587. if (typeof code === 'number') {
  588. this.formLabelAlign.goodsUnit = code ;
  589. } else {
  590. this.formLabelAlign.goodsUnit = id ;
  591. }
  592. const requestParam = this.buildUpdateRequest();
  593. console.log(requestParam);
  594. ExecDataByConfig(requestParam).then(response => {
  595. if (response.msg !== 'fail') {
  596. this.resetInsertForm();
  597. this.get_goods_data();
  598. this.isEdit= false;
  599. this.defaultCheckedKeys= [];
  600. this.$notify({
  601. title: '成功',
  602. message: '操作成功',
  603. type: 'success',
  604. duration: 2000,
  605. });
  606. } else {
  607. this.$notify({
  608. title: '失败',
  609. message: response.data,
  610. type: 'error',
  611. duration: 2000,
  612. });
  613. }
  614. });
  615. },
  616. handleAddAndOff(){
  617. this.handleAdd();
  618. this.dialogFormVisible = false;
  619. },
  620. handleAdd() {
  621. const requestParam = this.buildInsertRequest();
  622. ExecDataByConfig(requestParam).then(response => {
  623. if (response.msg !== 'fail') {
  624. this.resetInsertForm();
  625. this.get_goods_data();
  626. this.isEdit= false;
  627. this.defaultCheckedKeys= [];
  628. this.$notify({
  629. title: '成功',
  630. message: '操作成功',
  631. type: 'success',
  632. duration: 2000,
  633. });
  634. } else {
  635. this.$notify({
  636. title: '失败',
  637. message: response.data,
  638. type: 'error',
  639. duration: 2000,
  640. });
  641. }
  642. });
  643. },
  644. handleCancel(){
  645. this.defaultCheckedKeys= [];
  646. this.formLabelAlign.createrId = '';
  647. this.dialogFormVisible = false;
  648. this.dialogImageUrl = '';
  649. this.isShow = false;
  650. this.isView = false;
  651. this.resetInsertForm();
  652. this.isEdit= false;
  653. },
  654. handlePicChange(file, fileList) {
  655. },
  656. beforeImportExcel(file) {
  657. const isLt2M = file.size / 1024 / 1024 < 2
  658. if (!isLt2M) {
  659. this.$message.error('上传文件大小不能超过 2MB!')
  660. }
  661. return isLt2M
  662. },
  663. handleImportExcelSuccess(res, file) {
  664. // if (res.msg === 'ok') {
  665. if (res.msg === 'ok') {
  666. if (res.data.err_count > 0) {
  667. this.$message({
  668. title: '失败',
  669. message: '导入失败',
  670. type: 'danger',
  671. duration: 2000
  672. })
  673. this.$notify({
  674. title: '失败',
  675. message: '导入失败',
  676. type: 'danger',
  677. duration: 2000
  678. })
  679. import('@/vendor/Export2Excel').then(excel => {
  680. const list1 = res.data.result
  681. const tHeader = [
  682. '货品类别',
  683. '货品编号',
  684. '货品名称',
  685. '货品规格',
  686. '货品型号',
  687. '计量单位',
  688. '用途',
  689. '录入人',
  690. '备注', '错误信息'
  691. ]
  692. const filterVal = [
  693. '货品类别',
  694. '货品编号',
  695. '货品名称',
  696. '货品规格',
  697. '货品型号',
  698. '计量单位',
  699. '用途',
  700. '录入人',
  701. '备注','error_msg'
  702. ]
  703. const data1 = this.formatJson(filterVal, list1)
  704. excel.export_json_to_excel({
  705. header: tHeader,
  706. data: data1,
  707. filename: '货品信息_error',
  708. autoWidth: true,
  709. bookType: 'xlsx'
  710. })
  711. })
  712. }else{
  713. this.get_goods_data();
  714. this.$message({
  715. title: '成功',
  716. message: '导入成功',
  717. type: 'success',
  718. duration: 2000
  719. })
  720. this.$notify({
  721. title: '成功',
  722. message: '导入成功',
  723. type: 'success',
  724. duration: 2000
  725. })
  726. }
  727. } else {
  728. this.$notify({
  729. title: '失败',
  730. message: '上传失败',
  731. type: 'danger',
  732. duration: 2000
  733. })
  734. }
  735. },
  736. handlePicRemove(file, fileList) {
  737. console.log(file, fileList);
  738. console.log(fileList.length);
  739. if (fileList.length == 1) {
  740. document.getElementById('uploadPic').lastChild.style.display = "none"
  741. } else {
  742. document.getElementById('uploadPic').lastChild.style.display = "inline-block"
  743. }
  744. },
  745. handlePicSuccess(response, file, fileList) {
  746. console.log('文件上传成功时的钩子response', response, );
  747. console.log('文件上传成功时的钩子file', file);
  748. console.log('fileList', fileList);
  749. if (fileList.length == 1) {
  750. document.getElementById('uploadPic').lastChild.style.display = "none"
  751. } else {
  752. document.getElementById('uploadPic').lastChild.style.display = "inline-block"
  753. }
  754. this.$set(this.formLabelAlign, 'goodsImage', response.execresult.LastInsertId);
  755. },
  756. handlePictureCardPreview(file) {
  757. this.dialogImageUrl = file.url;
  758. this.dialogVisible = true;
  759. },
  760. popoverHideAdd(checkedIds,row){
  761. this.formLabelAlign.goodsTypeId = row.id;
  762. console.log(row);
  763. console.log(row.goodsTypeCode);
  764. console.log("11111111111111111");
  765. this.formLabelAlign.goodsCode = row.goodsTypeCode;
  766. console.log( this.formLabelAlign.goodsCode);
  767. },
  768. handleDel(row) {
  769. MessageBox.confirm('名称:' + row.goodsName, '确认删除?', {
  770. confirmButtonText: '确认',
  771. cancelButtonText: '取消',
  772. type: 'warning',
  773. }).then(() => {
  774. this.deleteGoodsParm.parammaps.id = row.id;
  775. PostDataByName(this.deleteGoodsParm).then(response => {
  776. if (response.msg !== 'fail') {
  777. this.get_goods_data();
  778. this.$notify({
  779. title: '成功',
  780. message: '删除成功',
  781. type: 'success',
  782. duration: 2000,
  783. });
  784. } else {
  785. failproccess(response, this.$notify);
  786. }
  787. });
  788. });
  789. },
  790. handleSwitchChange(index,row) {
  791. console.log(row.goodsEnabled);
  792. this.updateGoodsStatusByIdParm.parammaps.id = row.id;
  793. this.updateGoodsStatusByIdParm.parammaps.goodsEnabled = row.goodsEnabled;
  794. // if (row.goodsEnabled == 1 ){
  795. // console.log("00000000000000");
  796. // this.updateGoodsStatusByIdParm.parammaps.goodsEnabled = 0;
  797. // }else{
  798. // console.log("1111111111111111111");
  799. // this.updateGoodsStatusByIdParm.parammaps.goodsEnabled = 1;
  800. // }
  801. // 调用API更新状态
  802. PostDataByName(this.updateGoodsStatusByIdParm).then(response => {
  803. if (response.msg !== 'fail') {
  804. // 更新前端状态
  805. this.get_goods_data();
  806. // 显示成功通知
  807. this.$notify({
  808. title: '成功',
  809. message: '修改成功',
  810. type: 'success',
  811. duration: 2000,
  812. });
  813. } else {
  814. // 处理失败情况
  815. failproccess(response, this.$notify);
  816. }
  817. });
  818. },
  819. form_search(){
  820. this.get_goods_data();
  821. },
  822. template_excel(){
  823. import('@/vendor/Export2Excel').then(excel => {
  824. const tHeader = [
  825. '货品类别',
  826. '货品编号',
  827. '货品名称',
  828. '货品规格',
  829. '货品型号',
  830. '计量单位',
  831. '用途',
  832. '录入人',
  833. '备注'
  834. ];
  835. excel.export_json_to_excel({
  836. header: tHeader,
  837. data: [],
  838. filename: '货品模板',
  839. autoWidth: true,
  840. bookType: 'xlsx'
  841. })
  842. })
  843. },
  844. derive_data(){
  845. this.get_goods_data()
  846. import('@/vendor/Export2Excel').then(excel => {
  847. const tHeader = [
  848. '货品名称',
  849. '货品编号',
  850. '货品规格',
  851. '货品型号',
  852. '计量单位',
  853. '用途',
  854. '录入人',
  855. '一级分类',
  856. '二级分类',
  857. '三级分类'
  858. ];
  859. const filterVal = [
  860. 'goodsName',
  861. 'goodsCode',
  862. 'goodsSpecification',
  863. 'goodsModel',
  864. 'goodsUnit',
  865. 'purpose',
  866. 'createrName',
  867. 'goodsTypeName1',
  868. 'goodsTypeName2',
  869. 'goodsTypeName'
  870. ];
  871. const data1 = this.formatJson(filterVal, this.list)
  872. excel.export_json_to_excel({
  873. header: tHeader,
  874. data: data1,
  875. filename: '货品导出',
  876. autoWidth: true,
  877. bookType: 'xlsx'
  878. })
  879. })
  880. },
  881. formatJson(filterVal, jsonData) {
  882. return jsonData.map(v =>
  883. filterVal.map(j => {
  884. if (j === 'timestamp') {
  885. return parseTime(v[j])
  886. } else {
  887. return v[j]
  888. }
  889. })
  890. )
  891. },
  892. form_add(){
  893. this.isShow = true;
  894. this.isView = false;
  895. console.log("form_add called, isView set to:", this.isView);
  896. this.dialogTitle = "新增货品"
  897. this.formLabelAlign.createrId = Cookies.get('employeid');
  898. this.formLabelAlign.date = this.getDefaultDate();
  899. this.dialogFormVisible = true;
  900. },
  901. getDefaultDate() {
  902. const today = new Date();
  903. const year = today.getFullYear();
  904. const month = String(today.getMonth() + 1).padStart(2, '0');
  905. const day = String(today.getDate()).padStart(2, '0');
  906. return `${year}-${month}-${day}`;
  907. },
  908. handleGet(row){
  909. this.dialogTitle = "查看货品";
  910. this.isView = true;
  911. this.dialogFormVisible = true;
  912. this.formLabelAlign.id = row.id;
  913. this.formLabelAlign.goodsModel = row.goodsModel;
  914. this.formLabelAlign.goodsImage = row.goodsImage;
  915. this.formLabelAlign.goodsTypeId = row.goodsTypeId;
  916. this.formLabelAlign.goodsCode = row.goodsCode;
  917. this.formLabelAlign.goodsName = row.goodsName;
  918. this.formLabelAlign.goodsSpecification = row.goodsSpecification;
  919. this.formLabelAlign.purpose = row.purpose;
  920. this.formLabelAlign.goodsEnabled = row.goodsEnabled;
  921. this.formLabelAlign.date = row.createTime;
  922. this.formLabelAlign.remarks = row.remarks;
  923. this.defaultCheckedKeys = [row.goodsTypeId];
  924. this.formLabelAlign.createrId = row.createrId;
  925. this.formLabelAlign.goodsUnitId= row.goodsUnitId;
  926. this.formLabelAlign.goodsUnit = row.goodsUnit;
  927. this.dialogImageUrl = row.goodsImagePath;
  928. const fileList = [];
  929. var urlObj = { "url": "", "response": { "execresult": { "LastInsertId": "" } } };
  930. urlObj.url = row.goodsImagePath;
  931. urlObj.response.execresult.LastInsertId = row.goodsImage;
  932. fileList.push(urlObj);
  933. this.fileList = fileList;
  934. },
  935. handleEdit(row){
  936. this.dialogTitle = "修改货品";
  937. this.isEdit = true;
  938. this.dialogFormVisible = true;
  939. this.formLabelAlign.id = row.id;
  940. this.formLabelAlign.goodsEnabled = row.goodsEnabled;
  941. this.formLabelAlign.goodsModel = row.goodsModel;
  942. this.formLabelAlign.goodsImage = row.goodsImage;
  943. this.formLabelAlign.goodsTypeId = row.goodsTypeId;
  944. this.formLabelAlign.goodsCode = row.goodsCode;
  945. this.formLabelAlign.goodsName = row.goodsName;
  946. this.formLabelAlign.goodsSpecification = row.goodsSpecification;
  947. this.formLabelAlign.purpose = row.purpose;
  948. this.formLabelAlign.date = row.createTime;
  949. this.formLabelAlign.remarks = row.remarks;
  950. this.defaultCheckedKeys = [row.goodsTypeId];
  951. this.formLabelAlign.createrId = row.createrId;
  952. this.formLabelAlign.goodsUnitId= row.goodsUnitId;
  953. this.formLabelAlign.goodsUnit = row.goodsUnit;
  954. this.dialogImageUrl = row.goodsImagePath;
  955. const fileList = [];
  956. var urlObj = { "url": "", "response": { "execresult": { "LastInsertId": "" } } };
  957. urlObj.url = row.goodsImagePath;
  958. urlObj.response.execresult.LastInsertId = row.goodsImage;
  959. fileList.push(urlObj);
  960. this.fileList = fileList;
  961. },
  962. popoverHide(checkedIds,checkedData) {
  963. if (checkedIds !== null) {
  964. this.getGoodsListParm.parammaps.goodsTypeId = checkedData.id
  965. } else {
  966. this.getGoodsListParm.parammaps.goodsTypeId ='';
  967. }
  968. },
  969. handleNodeClick(data, node) {
  970. console.log(data);
  971. this.getGoodsListParm.parammaps.goodsTypeId = data.id;
  972. this.get_goods_data_left();
  973. },
  974. get_goods_type_data() {
  975. GetDataByName(this.getGoodsTypeParm).then((response) => {
  976. if (response.data && response.data.list) {
  977. const list = response.data.list.map(item => ({
  978. ...item,
  979. pid: parseInt(item.pid),
  980. id: parseInt(item.id),
  981. }));
  982. this.goodsTypeData = transData(list, 'id', 'pid', 'children');
  983. for (let i = 0; i < response.data.list.length; i++) {
  984. response.data.list[i].goodsTypeName = response.data.list[i].goodsTypeName +'/' +response.data.list[i].goodsTypeCode
  985. }
  986. const list1 = response.data.list.map(item => ({
  987. ...item,
  988. pid: parseInt(item.pid),
  989. id: parseInt(item.id),
  990. }));
  991. this.goodsTypeData1 = transData(list1, 'id', 'pid', 'children');
  992. }
  993. });
  994. },
  995. get_emp_data(){
  996. GetDataByName(this.getEmployeesSelectParm).then((response) => {
  997. if (response.data && response.data.list) {
  998. this.empList = response.data.list;
  999. }else{
  1000. this.empList = [];
  1001. }
  1002. });
  1003. },
  1004. get_goods_data() {
  1005. if (
  1006. this.getGoodsListParm.parammaps.inputDatetime2 !== undefined &&
  1007. this.getGoodsListParm.parammaps.inputDatetime2 !== null
  1008. ) {
  1009. this.getGoodsListParm.parammaps.startTime = this.getGoodsListParm.parammaps.inputDatetime2[0]
  1010. this.getGoodsListParm.parammaps.stopTime = this.getGoodsListParm.parammaps.inputDatetime2[1]
  1011. } else {
  1012. this.getGoodsListParm.parammaps.startTime = ''
  1013. this.getGoodsListParm.parammaps.stopTime = ''
  1014. }
  1015. GetDataByName(this.getGoodsListParm).then((response) => {
  1016. if (response.data && response.data.list) {
  1017. this.list = response.data.list;
  1018. this.listLoading = false;
  1019. for (let i = 0; i < response.data.list.length; i++) {
  1020. if (
  1021. response.data.list[i].goodsImagePath !== null
  1022. ) {
  1023. this.list[i].goodsImagePath =
  1024. process.env.VUE_APP_BASE_API + response.data.list[i].goodsImagePath;
  1025. } else {
  1026. this.list[i].goodsImagePath = ''
  1027. }
  1028. }
  1029. this.pageNum = response.data.pageNum
  1030. this.pageSize = response.data.pageSize
  1031. this.total = response.data.total
  1032. }else{
  1033. this.list = [];
  1034. this.listLoading = false;
  1035. }
  1036. });
  1037. },
  1038. get_dict_list(){
  1039. GetDataByName(this.getDictList).then((response) => {
  1040. if (response.data && response.data.list) {
  1041. this.measureList = response.data.list;
  1042. }
  1043. });
  1044. },
  1045. get_goods_data_left() {
  1046. if (
  1047. this.getGoodsListParm.parammaps.inputDatetime2 !== undefined &&
  1048. this.getGoodsListParm.parammaps.inputDatetime2 !== null
  1049. ) {
  1050. this.getGoodsListParm.parammaps.startTime = this.getGoodsListParm.parammaps.inputDatetime2[0]
  1051. this.getGoodsListParm.parammaps.stopTime = this.getGoodsListParm.parammaps.inputDatetime2[1]
  1052. } else {
  1053. this.getGoodsListParm.parammaps.startTime = ''
  1054. this.getGoodsListParm.parammaps.stopTime = ''
  1055. }
  1056. GetDataByName(this.getGoodsListParm).then((response) => {
  1057. if (response.data && response.data.list) {
  1058. this.list = response.data.list;
  1059. this.listLoading = false;
  1060. for (let i = 0; i < response.data.list.length; i++) {
  1061. if (
  1062. response.data.list[i].goodsImagePath !== null
  1063. ) {
  1064. this.list[i].goodsImagePath =
  1065. process.env.VUE_APP_BASE_API + response.data.list[i].goodsImagePath;
  1066. } else {
  1067. this.list[i].goodsImagePath = ''
  1068. }
  1069. }
  1070. this.pageNum = response.data.pageNum
  1071. this.pageSize = response.data.pageSize
  1072. this.total = response.data.total
  1073. }else{
  1074. this.list = [];
  1075. this.listLoading = false;
  1076. }
  1077. this.getGoodsListParm.parammaps.goodsTypeId = '';
  1078. });
  1079. }
  1080. },
  1081. computed: {
  1082. // 设置请求头
  1083. headers() {
  1084. return {
  1085. // 设置token
  1086. token: getToken()
  1087. }
  1088. },
  1089. uploadData() {
  1090. return {
  1091. name: 'importGoodsExecl',
  1092. importParams: '货品类别,货品编号,货品名称,货品规格,货品型号,计量单位,用途,录入人,备注',
  1093. sheetname: 'SheetJS'
  1094. }
  1095. }
  1096. },
  1097. created() {
  1098. console.log('defaultProps:', this.defaultProps);
  1099. console.log('getGoodsListParm:', this.getGoodsListParm);
  1100. this.get_goods_type_data();
  1101. this.get_emp_data();
  1102. this.get_dict_list();
  1103. this.get_goods_data();
  1104. },
  1105. };
  1106. </script>
  1107. <style scoped>
  1108. .inline-form-item {
  1109. display: flex;
  1110. align-items: center;
  1111. }
  1112. .inline-form-item .el-form-item__label {
  1113. margin-right: 10px; /* 调整标签和输入框之间的间距 */
  1114. }
  1115. ::v-deep .el-tree-node {
  1116. margin-bottom: 5px; /* 调整节点之间的间距 */
  1117. }
  1118. ::v-deep .el-tree-node__label {
  1119. font-size: 20px; /* 调整字体大小 */
  1120. }
  1121. </style>
  1122. <style>
  1123. .app-container {
  1124. padding: 10px;
  1125. margin-left: 10px;
  1126. }
  1127. .search-button-container {
  1128. padding: 10px;
  1129. padding-left: 20px;
  1130. }
  1131. .typeSelect span .el-popover__reference .el-input--suffix {
  1132. top: -3px;
  1133. .el-input__inner {
  1134. height: 40px !important;
  1135. }
  1136. }
  1137. .filter-item {
  1138. margin-left: 10px; /* 设置左边距 */
  1139. }
  1140. .inputDatetime {
  1141. padding: 0;
  1142. margin: 0 10px;
  1143. margin-left: 10px;
  1144. }
  1145. .search-button {
  1146. padding: 10px 20px;
  1147. border: 0.01px solid #ccc; /* 黑色边框,宽度为 2px */
  1148. margin-right: 10px;
  1149. }
  1150. .search-button-upload {
  1151. padding: 10px 20px;
  1152. border: 0.01px solid #ccc; /* 黑色边框,宽度为 2px */
  1153. margin-right: 20px;
  1154. }
  1155. .el-table .warning-row {
  1156. background: oldlace;
  1157. }
  1158. .el-table .success-row {
  1159. background: #f0f9eb;
  1160. }
  1161. .form-item {
  1162. width:40%;
  1163. display: flex;
  1164. flex-direction: column;
  1165. gap: 10px; /* 调整内部间距 */
  1166. }
  1167. #uploadPic {
  1168. width: 700px;
  1169. }
  1170. .dialog-footer{
  1171. right:10px;
  1172. position:absolute;
  1173. bottom:10px;
  1174. }
  1175. .add-button {
  1176. background-color: #2196f3; /* 绿色背景 */
  1177. color: white; /* 白色文字 */
  1178. padding: 10px 20px; /* 内边距 */
  1179. border-radius: 5px; /* 圆角 */
  1180. cursor: pointer; /* 鼠标悬停时显示手型 */
  1181. font-size: 16px; /* 字体大小 */
  1182. transition: background-color 0.3s ease; /* 背景颜色过渡效果 */
  1183. padding: 8px 12px;
  1184. margin: 15px 30px;
  1185. border: 0.01px solid #ccc; /* 黑色边框,宽度为 2px */
  1186. }
  1187. </style>