goods.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title></title>
  5. #parse("sys/header.html")
  6. <style>
  7. .upload-list {
  8. display: inline-block;
  9. width: 60px;
  10. height: 60px;
  11. text-align: center;
  12. line-height: 60px;
  13. border: 1px solid transparent;
  14. border-radius: 4px;
  15. overflow: hidden;
  16. background: #fff;
  17. position: relative;
  18. box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
  19. margin-right: 4px;
  20. }
  21. .upload-list img {
  22. width: 100%;
  23. height: 100%;
  24. }
  25. .upload-list-cover {
  26. display: none;
  27. position: absolute;
  28. top: 0;
  29. bottom: 0;
  30. left: 0;
  31. right: 0;
  32. background: rgba(0, 0, 0, .6);
  33. }
  34. .upload-list:hover .upload-list-cover {
  35. display: block;
  36. }
  37. .upload-list-cover i {
  38. color: #fff;
  39. font-size: 20px;
  40. cursor: pointer;
  41. margin: 0 2px;
  42. }
  43. .hselect {
  44. margin: 0;
  45. padding: 0;
  46. }
  47. </style>
  48. </head>
  49. <body>
  50. <div id="rrapp" v-cloak>
  51. <div v-show="showList">
  52. <Row :gutter="16">
  53. <div class="search-group">
  54. <i-col span="3">
  55. <i-select v-model="q.merchSn" placeholder="商户编号" filterable label-in-value>
  56. <i-option v-for="merch in queryMerch" :value="merch.merchSn"
  57. :key="merch.merchSn">{{merch.merchName}}
  58. </i-option>
  59. </i-select>
  60. </i-col>
  61. <i-col span="3">
  62. <i-input v-model="q.goodsSn" @on-enter="query" placeholder="商品编码"/>
  63. </i-col>
  64. <i-col span="3">
  65. <i-input v-model="q.prodBarcode" @on-enter="query" placeholder="产品条码"/>
  66. </i-col>
  67. <i-col span="3">
  68. <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
  69. </i-col>
  70. <i-col span="3">
  71. <i-select v-model="q.goodsBizType" placeholder="货品业务类型"
  72. label-in-value>
  73. <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
  74. </i-option>
  75. </i-select>
  76. </i-col><!--
  77. <i-col span="3">
  78. <i-select v-model="q.category" placeholder="商品分类" filterable @on-change="changeQueryCategories"
  79. label-in-value>
  80. <i-option v-for="category in queryCategories" :value="category.id"
  81. :key="categoqry.id">{{category.name}}
  82. </i-option>
  83. </i-select>
  84. </i-col>
  85. <i-col span="3">
  86. <i-select v-model="q.categoryTwo" placeholder="商品二级分类" filterable label-in-value>
  87. <i-option v-for="category in queryCategoriesTwo" :value="category.id"
  88. :key="category.id">{{category.name}}
  89. </i-option>
  90. </i-select>
  91. </i-col>-->
  92. <i-button @click="query">查询</i-button>
  93. <i-button @click="reloadSearch">重置</i-button>
  94. </div>
  95. <div class="buttons-group" style="width: 100%;margin-top: 8px; padding-left: 10px;">
  96. #if($shiro.hasPermission("goods:save"))
  97. <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
  98. #end
  99. #if($shiro.hasPermission("goods:update"))
  100. <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
  101. #end
  102. #if($shiro.hasPermission("goods:delete"))
  103. <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
  104. #end
  105. #if($shiro.hasPermission("goods:unSaleBatch"))
  106. <i-button type="primary" @click="enSale"><i class="fa fa-hand-o-up"></i>&nbsp;上架</i-button>
  107. <i-button type="dashed" @click="unSale"><i class="fa fa-hand-o-down"></i>&nbsp;下架</i-button>
  108. #end
  109. <!--<i-button type="info" @click="goodsExport"><i class="fa fa-plus"></i>&nbsp;商品导入</i-button>-->
  110. <!--<i-button type="info" @click="sameGoodsExport"><i class="fa fa-plus"></i>&nbsp;普货商品导入</i-button>-->
  111. #if($shiro.hasPermission("goods:upload"))
  112. <i-col style="display: inline-grid;">
  113. <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
  114. :format="['xls','xlsx']"
  115. action="../goods/upload">
  116. <i-button type="ghost" icon="ios-cloud-upload-outline">商品导入</i-button>
  117. </Upload>
  118. </i-col>
  119. #end
  120. #if($shiro.hasPermission("goods:generalGoodsUpload"))
  121. <i-col style="display: inline-grid;">
  122. <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
  123. :format="['xls','xlsx']"
  124. action="../goods/generalGoodsUpload">
  125. <i-button type="ghost" icon="ios-cloud-upload-outline">普货商品导入</i-button>
  126. </Upload>
  127. </i-col>
  128. #end
  129. #if($shiro.hasPermission("goods:down"))
  130. &nbsp;&nbsp;&nbsp;&nbsp;
  131. <a href="../statics/file/goods_export_yyyy_mm_dd_v1.0.0.xls">商品模板下载</a>&nbsp;&nbsp;&nbsp;&nbsp;
  132. <a href="../statics/file/general_goods_export_yyyy_mm_dd_v1.0.0.xls">普货商品模板下载</a>
  133. #end
  134. </div>
  135. </Row>
  136. <table id="jqGrid"></table>
  137. <div id="jqGridPager"></div>
  138. </div>
  139. <Card v-show="!showList">
  140. <p slot="title">{{title}}</p>
  141. <i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="140">
  142. <Tabs value="name1">
  143. <Tab-Pane label="通用信息" name="name1">
  144. <Row>
  145. <i-col span="16" style="margin-top: -10px;">
  146. <span style="margin-left: 140px;color: red;font-size: 12px;">* 修改商品二级分类将清空商品参数列表</span>
  147. </i-col>
  148. </Row>
  149. <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
  150. <Form-item label="商户" prop="merchSn">
  151. <i-select v-model="goods.merchSn" filterable placeholder="商户" @on-change="showMerchInfo" label-in-value>
  152. <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
  153. </i-select>
  154. </Form-item>
  155. <Form-item label="第三方商户" prop="merchSn">
  156. <i-select v-model="goods.thirdPartyMerchCode" placeholder="第三方商户" @on-change="showStockShare" label-in-value>
  157. <i-option v-for="thirdMerchant in thirdMerchantBizList" :value="thirdMerchant.thirdPartyMerchCode" :key="thirdMerchant.thirdPartyMerchCode">{{thirdMerchant.thirdPartyMerchName}}</i-option>
  158. </i-select>
  159. </Form-item>
  160. <Form-item label="货品业务类型" prop="goodsBizType" >
  161. <i-select v-model="goods.goodsBizType" placeholder="货品业务类型"
  162. label-in-value style="width: 268px;" @on-change="changeGoodsBizType">
  163. <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
  164. </i-option>
  165. </i-select>
  166. </Form-item>
  167. <Form-item label="商品编码" prop="goodsSn">
  168. <i-input v-model="goods.goodsSn" placeholder="商品编码"/>
  169. </Form-item>
  170. <Form-item label="名称" prop="name">
  171. <i-input v-model="goods.name" placeholder="名称"/>
  172. </Form-item>
  173. <Form-item label="商品单位" prop="goodsUnit">
  174. <i-input v-model="goods.goodsUnit" placeholder="商品单位" style="width: 268px;"/>
  175. </Form-item>
  176. <!--<Form-item label="类别" prop="attributeCategory" style="width: 268px;">
  177. <i-select v-model="goods.attributeCategory" filterable label-in-value>
  178. <i-option v-for="attributeCategory in attributeCategories" :value="attributeCategory.id" :key="attributeCategory.id">{{attributeCategory.name}}
  179. </i-option>
  180. </i-select>
  181. </Form-item>-->
  182. <Form-item label="SKU" prop="sku">
  183. <i-input v-model="goods.sku" placeholder="SKU" style="width: 268px;"/>
  184. </Form-item>
  185. <Form-item label="产品条码" prop="prodBarcode">
  186. <i-input v-model="goods.prodBarcode" placeholder="产品条码"/>
  187. </Form-item>
  188. <Form-item label="供应商" prop="supplierId">
  189. <i-select v-model="goods.supplierId" placeholder="供应商"
  190. label-in-value style="width: 268px;">
  191. <i-option v-for="supplier in suppliers" :value="supplier.id" :key="supplier.id">{{supplier.childSupplierName}}
  192. </i-option>
  193. </i-select>
  194. </Form-item>
  195. <!--<Form-item label="运费模版" prop="freightId">
  196. <i-select v-model="goods.freightId" placeholder="运费模版"
  197. label-in-value style="width: 268px;">
  198. <i-option v-for="freight in freights" :value="freight.id" :key="freight.id">{{freight.name}}
  199. </i-option>
  200. </i-select>
  201. </Form-item>-->
  202. <!--<Form-item label="市场价" prop="marketPrice">-->
  203. <!--<Input-number :min="0.01" :step="0.01" v-model="goods.marketPrice" placeholder="市场价" style="width: 268px;"/>-->
  204. <!--</Form-item>-->
  205. <!--<Form-item label="零售价" prop="retailPrice">-->
  206. <!--<Input-number :min="0.01" :step="0.01" v-model="goods.retailPrice" placeholder="零售价" style="width: 268px;"/>-->
  207. <!--</Form-item>-->
  208. <Form-item label="商品库存" prop="goodsNumber" v-show="isStockShare">
  209. <i-input v-model="goods.goodsNumber" placeholder="商品库存" style="width: 268px;"/>
  210. </Form-item>
  211. <Form-item label="商品税率(0.00)" prop="goodsRate">
  212. <Input-number :min="0.001" :step="0.001" v-model="goods.goodsRate" placeholder="商品税率" style="width: 268px;"/>
  213. </Form-item>
  214. <Row>
  215. <i-col span="16">
  216. <Form-item label="商品主图" prop="primaryPicUrl">
  217. <i-input v-model="goods.primaryPicUrl" placeholder="商品主图" readonly/>
  218. </Form-item>
  219. </i-col>
  220. <i-col span="4">
  221. <Form-item :label-width="1">
  222. <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
  223. max-size="2048"
  224. :on-success="handleSuccessPicUrl" :on-format-error="handleFormatError"
  225. :show-upload-list="false"
  226. :on-exceeded-size="handleMaxSize">
  227. <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
  228. </Upload>
  229. </Form-item>
  230. </i-col>
  231. <i-col span="4">
  232. <Form-item :label-width="1">
  233. <i-button icon="eye" @click="eyeImagePicUrl">预览图片</i-button>
  234. </Form-item>
  235. </i-col>
  236. </Row>
  237. <Row>
  238. <i-col span="16" style="margin-top: -30px;">
  239. <span style="margin-left: 140px;color: red;font-size: 12px;">* 尺寸建议200x200(正方形模式)像素以内,大小2M以下</span>
  240. </i-col>
  241. </Row>
  242. <Row>
  243. <i-col span="16">
  244. <Form-item label="商品列表图" prop="listPicUrl">
  245. <i-input v-model="goods.listPicUrl" placeholder="商品列表图" readonly/>
  246. </Form-item>
  247. </i-col>
  248. <i-col span="4">
  249. <Form-item :label-width="1">
  250. <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
  251. max-size="2048"
  252. :on-success="handleSuccessListPicUrl" :on-format-error="handleFormatError"
  253. :show-upload-list="false"
  254. :on-exceeded-size="handleMaxSize">
  255. <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
  256. </Upload>
  257. </Form-item>
  258. </i-col>
  259. <i-col span="4">
  260. <Form-item :label-width="1">
  261. <i-button icon="eye" @click="eyeImageListPicUrl">预览图片</i-button>
  262. </Form-item>
  263. </i-col>
  264. </Row>
  265. <Row>
  266. <i-col span="16" style="margin-top: -30px;">
  267. <span style="margin-left: 140px;color: red;font-size: 12px;">* 尺寸建议200x200(正方形模式)像素以内,大小2M以下</span>
  268. </i-col>
  269. </Row>
  270. <Row>
  271. <i-col span="16">
  272. <Form-item label="上传视频" prop="listPicUrl">
  273. <i-input v-model="goods.videoUrl" placeholder="主视频" readonly/>
  274. </Form-item>
  275. </i-col>
  276. <i-col span="4">
  277. <Form-item :label-width="1">
  278. <Upload style="width: 300px;" action="../sys/oss/upload" :format="['mp4']"
  279. max-size="2048"
  280. :on-success="handleSuccessListVideoUrl" :on-format-error="handleVideoFormatError"
  281. :show-upload-list="false"
  282. :on-exceeded-size="handleVideoMaxSize">
  283. <i-button icon="ios-cloud-upload-outline">本地上传</i-button>
  284. </Upload>
  285. </Form-item>
  286. </i-col>
  287. <i-col span="4">
  288. <Form-item :label-width="1">
  289. <i-button icon="eye" @click="eyeImageListVideoUrl">预览视频</i-button>
  290. </Form-item>
  291. </i-col>
  292. </Row>
  293. <Row>
  294. <i-col span="16" style="margin-top: -30px;">
  295. <span style="margin-left: 140px;color: red;font-size: 12px;">* 视频不能超过10M,视频时限20秒内,支持mp4视频格式</span>
  296. </i-col>
  297. </Row>
  298. <!--</i-form>-->
  299. </Tab-Pane>
  300. <Tab-Pane label="海关信息" name="name2">
  301. <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
  302. <Form-item label="产品品牌" prop="brand">
  303. <i-input v-model="goods.brand" placeholder="产品品牌"/>
  304. </Form-item>
  305. <Form-item label="海关备案编号" prop="cusRecCode">
  306. <i-input v-model="goods.cusRecCode" placeholder="海关备案编号"/>
  307. </Form-item>
  308. <Form-item label="计量单位" prop="unitCode">
  309. <i-select v-model="goods.unitCode" filterable placeholder="计量单位"
  310. label-in-value>
  311. <i-option v-for="cusUnitCode in cusUnitCodeList" :value="cusUnitCode.code" :key="cusUnitCode.sn">{{cusUnitCode.name}}
  312. </i-option>
  313. </i-select>
  314. </Form-item>
  315. <Form-item label="海关商品编码" prop="cusGoodsCode">
  316. <i-input v-model="goods.cusGoodsCode" placeholder="海关商品编码"/>
  317. </Form-item>
  318. <Form-item label="国检规格型号" prop="ciqProdModel" >
  319. <i-input v-model="goods.ciqProdModel" placeholder="国检规格型号"/>
  320. </Form-item>
  321. <Form-item label="原产国" prop="oriCntCode">
  322. <i-select v-model="goods.oriCntCode" filterable placeholder="原产国"
  323. label-in-value>
  324. <i-option v-for="cusNationCode in cusNationCodeList" :value="cusNationCode.code" :key="cusNationCode.sn">{{cusNationCode.name}}
  325. </i-option>
  326. </i-select>
  327. </Form-item>
  328. <Form-item label="海关申报要素" prop="cusDeclEle">
  329. <i-input v-model="goods.cusDeclEle" placeholder="海关申报要素"/>
  330. </Form-item>
  331. <!--</i-form>-->
  332. </Tab-Pane>
  333. <!--<Tab-Pane label="规格" name="name3">
  334. &lt;!&ndash;<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">&ndash;&gt;
  335. <table class="table table-bordered">
  336. <tr>
  337. <td style="text-align: center; width: 200px">编码</td>
  338. <td style="text-align: center; width: 100px">商品默认</td>
  339. &lt;!&ndash;<td style="text-align: center; width: 100px">规格</td>&ndash;&gt;
  340. <td style="text-align: center;">规格说明</td>
  341. <td style="text-align: center; width: 90px">操作</td>
  342. </tr>
  343. <tr v-for="(item,index) in productEntityList" v-show="item.isDelete==0">
  344. <td>
  345. <i-input v-model="item.goodsSn" placeholder="商品编码"/>
  346. </td>
  347. <td>
  348. <select class="hselect" v-model="item.goodsDefault" filterable label-in-value>
  349. <option value="1">是</option>
  350. <option value="0">否</option>
  351. </select>
  352. </td>
  353. <td>
  354. <i-input v-model="item.goodsSpecificationNameValue" placeholder="规格说明"/>
  355. </td>
  356. <td>
  357. <button v-if="index == 0" class="btn btn-primary btn-sm" type="button"
  358. @click="addSpeRow">
  359. <i class="fa fa-plus"></i>
  360. </button>
  361. <button class="btn red btn-sm" type="button" @click="delSpeRow(index)">
  362. <i class="fa fa-trash-o"></i>
  363. </button>
  364. </td>
  365. </tr>
  366. </table>
  367. &lt;!&ndash;</i-form>&ndash;&gt;
  368. </Tab-Pane>-->
  369. <Tab-Pane label="详细描述" name="name4">
  370. <template>
  371. <div class="upload-list" v-for="item in uploadList">
  372. <template v-if="item.status === 'finished'">
  373. <img :src="item.imgUrl"/>
  374. <div class="upload-list-cover">
  375. <Icon type="ios-eye-outline" @click.native="handleView(item.imgUrl)"></Icon>
  376. <Icon type="ios-trash-outline" @click.native="handleRemove(item)"></Icon>
  377. </div>
  378. </template>
  379. <template v-else>
  380. <Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
  381. </template>
  382. </div>
  383. <Upload
  384. ref="upload"
  385. :show-upload-list="false"
  386. :default-file-list="uploadList"
  387. :on-success="handleSuccess"
  388. :format="['jpg','jpeg','png']"
  389. :max-size="2048"
  390. :on-format-error="handleFormatError"
  391. :on-exceeded-size="handleMaxSize"
  392. :before-upload="handleBeforeUpload"
  393. multiple
  394. type="drag"
  395. action="../sys/oss/upload"
  396. style="display: inline-block;width:58px;">
  397. <div style="width: 58px;height:58px;line-height: 58px;">
  398. <Icon type="camera" size="20"></Icon>
  399. </div>
  400. </Upload>
  401. <Modal title="查看图片" v-model="visible">
  402. <img :src="imgName" v-if="visible" style="width: 100%"/>
  403. </Modal>
  404. <span style="color: red;font-size: 12px;">* 商品详情轮播图,尺寸建议750x750(正方形模式)像素以内,大小2M以下</span>
  405. </template>
  406. <div id="goodsDesc"></div>
  407. </Tab-Pane>
  408. <!--<Tab-Pane label="参数" name="name5">-->
  409. <!--&lt;!&ndash;<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">&ndash;&gt;-->
  410. <!---->
  411. <!--&lt;!&ndash;</i-form>&ndash;&gt;-->
  412. <!--</Tab-Pane>-->
  413. <Tab-Pane label="其他信息" name="name6">
  414. <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
  415. <Form-item label="排序" prop="sortOrder">
  416. <Input-number :min="1" :step="1" v-model="goods.sortOrder" placeholder="排序" style="width: 188px;"/>
  417. </Form-item>
  418. <Form-item label="上架" prop="isOnSale">
  419. <Radio-group v-model="goods.isOnSale">
  420. <Radio label="0">
  421. <span>否</span>
  422. </Radio>
  423. <Radio label="1">
  424. <span>是</span>
  425. </Radio>
  426. </Radio-group>
  427. </Form-item>
  428. <Form-item v-if="showInput" label="热销" prop="isHot">
  429. <Radio-group v-model="goods.isHot">
  430. <Radio label="0">
  431. <span>否</span>
  432. </Radio>
  433. <Radio label="1">
  434. <span>是</span>
  435. </Radio>
  436. </Radio-group>
  437. </Form-item>
  438. <Form-item label="推广描述" prop="promotionDesc">
  439. <i-input v-model="goods.promotionDesc" placeholder="推广描述"/>
  440. </Form-item>
  441. <Form-item label="简明介绍" prop="goodsBrief">
  442. <i-input v-model="goods.goodsBrief" placeholder="简明介绍"/>
  443. </Form-item>
  444. <!--</i-form>-->
  445. </Tab-Pane>
  446. </Tabs>
  447. </i-form>
  448. <div style="padding-left: 20px">
  449. <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
  450. <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
  451. <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
  452. </div>
  453. </Card>
  454. </div>
  455. <!-- 选择类型 -->
  456. <div id="categoryLayer" style="display: none;padding: 10px;">
  457. <ul id="categoryTree" class="ztree"></ul>
  458. </div>
  459. <script src="${rc.contextPath}/js/shop/goods.js?_${date.systemTime}"></script>
  460. </body>
  461. </html>