edit.vue 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. <template>
  2. <view>
  3. <view class="add_page">
  4. <up-navbar class="nav-bar" title="商品入库" :autoBack="true" :placeholder="true" v-hideNav>
  5. <template #right>
  6. <view class="u-nav-slot">
  7. <up-checkbox-group v-model="continuousWarehousing" placement="column">
  8. <up-checkbox label="连续入库" name="1"></up-checkbox>
  9. </up-checkbox-group>
  10. </view>
  11. </template>
  12. </up-navbar>
  13. <view class="form_list">
  14. <up-form labelPosition="top" :model="formData" :rules="rules" ref="addForm" labelWidth="auto">
  15. <up-form-item borderBottom class="u-form-item-col">
  16. <up-textarea v-model="recognitionContent" placeholder='品牌:-
  17. 来源:-
  18. 实价:-
  19. 型号:-
  20. 编码:-
  21. 日期:-
  22. 备注:-
  23. 付款方式:-' confirmType="done" height="170" :maxlength="-1">
  24. </up-textarea>
  25. <view class="btn_group_recognition">
  26. <up-button text="清除" @click="clearRecognitionContent()"></up-button>
  27. <up-button text="粘贴识别" type="primary"
  28. @click="handlePasteRecognition(recognitionContent)"></up-button>
  29. </view>
  30. </up-form-item>
  31. <up-form-item v-if="getWarehouseFieldPermissions('goodPicFileList','read')" :label="'商品图片('+formData.goodPicFileList.length+'张)'" required borderBottom>
  32. <view class="imgs_scroll">
  33. <DragUpload ref="dragUpload" :images="formData.goodPicFileList" :isDelete="true" :isPreview="true" @imagesChanged="goodPicFileListImagesChanged" @uploadComplete="goodPicFileListUploadComplete"></DragUpload>
  34. <!-- <ImgsRowScroll v-if="formData.goodPicFileList.length > 0" :isShowDeleteIcon="true"
  35. @deleteImgInfo="getDeleteGoodPicInfo" imgMode="aspectFill" :totalWidth="400"
  36. :images="formData.goodPicFileList" :previewEnabled="true" :imageWidth="150"
  37. :imageHeight="150"></ImgsRowScroll>
  38. <up-upload @afterRead="afterReadGoodPic" name="3" multiple :maxCount="9"
  39. :previewFullImage="true"></up-upload> -->
  40. </view>
  41. </up-form-item>
  42. <up-form-item v-if="getWarehouseFieldPermissions('desc','read')" label="商品描述(详细的描述让用户更好的了解您的产品)" required prop="desc" borderBottom>
  43. <up-textarea v-model="formData.desc" clearable count autoHeight maxlength="250" :height="150" confirmType="done"></up-textarea>
  44. </up-form-item>
  45. <up-form-item v-if="getWarehouseFieldPermissions('origin','read')" label="来源" prop="origin" borderBottom>
  46. <up-textarea v-model="formData.origin" clearable placeholder="请输入来源" count autoHeight maxlength="250" height="100" confirmType="done"></up-textarea>
  47. </up-form-item>
  48. <up-form-item v-if="getWarehouseFieldPermissions('type','read')" label="商品分类" required prop="type" borderBottom>
  49. <TabSelect :tabList="typeList" :isClear="typeIsClear" @tabChange="handleTabChangeType"
  50. labelKey="dictLabel" valueKey="dictValue" :colNum="4" mode="single" :echoInfo="echoInfoType">
  51. </TabSelect>
  52. </up-form-item>
  53. <up-form-item v-if="getWarehouseFieldPermissions('dictLabel','read')" label="品牌" required prop="dictLabel" class="u-form-item-row" borderBottom
  54. @click="showBrandList">
  55. <Cell :stop="false" :val="formData.dictLabel"></Cell>
  56. <BrandList ref="brandListRef" @selectedBrand="handleSelectedBrand"></BrandList>
  57. </up-form-item>
  58. <up-form-item v-if="getWarehouseFieldPermissions('series','read')" label="系列" class="u-form-item-row" borderBottom>
  59. <up-input v-model="formData.series" placeholder="请输入" clearable border="none"></up-input>
  60. </up-form-item>
  61. <up-form-item v-if="getWarehouseFieldPermissions('model','read')" label="型号" required prop="model" class="u-form-item-row" borderBottom>
  62. <up-input v-model="formData.model" placeholder="请输入" clearable border="none"></up-input>
  63. </up-form-item>
  64. <up-form-item v-if="getWarehouseFieldPermissions('dialType','read')" label="机芯类型" class="u-form-item-row" borderBottom>
  65. <up-input v-model="formData.dialType" placeholder="请输入" clearable border="none"></up-input>
  66. </up-form-item>
  67. <up-form-item v-if="getWarehouseFieldPermissions('caseMaterial','read')" label="表壳材质" class="u-form-item-row" borderBottom>
  68. <up-input v-model="formData.caseMaterial" placeholder="请输入" clearable border="none"></up-input>
  69. </up-form-item>
  70. <up-form-item v-if="getWarehouseFieldPermissions('dialDiameter','read')" label="表盘直径" class="u-form-item-row" borderBottom>
  71. <up-input v-model="formData.dialDiameter" placeholder="请输入" clearable border="none"></up-input>
  72. </up-form-item>
  73. <up-form-item v-if="getWarehouseFieldPermissions('material','read')" label="材质" class="u-form-item-row" borderBottom>
  74. <up-input v-model="formData.material" placeholder="请输入" clearable border="none"></up-input>
  75. </up-form-item>
  76. <up-form-item v-if="getWarehouseFieldPermissions('size','read')" label="尺寸" class="u-form-item-row" borderBottom>
  77. <up-input v-model="formData.size" placeholder="请输入" clearable border="none"></up-input>
  78. </up-form-item>
  79. <up-form-item v-if="getWarehouseFieldPermissions('yardage','read')" label="尺码" class="u-form-item-row" borderBottom>
  80. <up-input v-model="formData.yardage" placeholder="请输入" clearable border="none"></up-input>
  81. </up-form-item>
  82. <up-form-item v-if="getWarehouseFieldPermissions('productCondition','read')" label="商品成色" required prop="productCondition" borderBottom>
  83. <TabSelect :tabList="productConditionList" :isClear="productConditionIsClear"
  84. @tabChange="handleTabChangeProductCondition" :colNum="2" mode="single" :echoInfo="echoInfoProductCondition">
  85. </TabSelect>
  86. </up-form-item>
  87. <up-form-item v-if="getWarehouseFieldPermissions('detailPicFileList','read')" :label="'细节图(' + (formData.detailPicFileList.length || 0) + '张)'" borderBottom>
  88. <!-- <view class="detail_pic_container"> -->
  89. <!-- <view>
  90. <text class="tip">视频:</text>
  91. <ImgsRowScroll v-if="formData.detailVideoFileList.length > 0" :isShowDeleteIcon="true"
  92. @deleteVideoInfo="getDeleteDetailVideoInfo" imgMode="aspectFill" :totalWidth="400"
  93. :videos="formData.detailVideoFileList" :previewEnabled="true" :imageWidth="150"
  94. :imageHeight="150" accept="video"></ImgsRowScroll>
  95. <up-upload @afterRead="afterReadDeatilVideo" name="2" multiple :maxCount="10" accept="video"></up-upload>
  96. </view> -->
  97. <!-- <view> -->
  98. <!-- <text class="tip">图片:</text> -->
  99. <view class="imgs_scroll">
  100. <DragUpload ref="dragUpload" :images="formData.detailPicFileList" :isDelete="true" :isPreview="true" @imagesChanged="detailPicFileListImagesChanged" @uploadComplete="detailPicFileListUploadComplete"></DragUpload>
  101. <!-- <ImgsRowScroll v-if="formData.detailPicFileList.length > 0" :isShowDeleteIcon="true"
  102. @deleteImgInfo="getDeleteDetailPicInfo" imgMode="aspectFill" :totalWidth="400"
  103. :images="formData.detailPicFileList" :previewEnabled="true" :imageWidth="150"
  104. :imageHeight="150"></ImgsRowScroll>
  105. <up-upload @afterRead="afterReadDetailPic" name="1" multiple :maxCount="10"></up-upload> -->
  106. </view>
  107. <!-- </view> -->
  108. <!-- </view> -->
  109. </up-form-item>
  110. <up-form-item v-if="getWarehouseFieldPermissions('title','read')" label="商品标题" borderBottom>
  111. <up-textarea v-model="formData.title" clearable :placeholder="titlePlaceholder" count autoHeight
  112. maxlength="50" height="100" confirmType="done"></up-textarea>
  113. </up-form-item>
  114. <up-form-item v-if="getWarehouseFieldPermissions('productNo','read')" label="商品货号" class="u-form-item-row" borderBottom>
  115. <up-input v-model="formData.productNo" placeholder="请输入" clearable border="none"></up-input>
  116. </up-form-item>
  117. <up-form-item v-if="getWarehouseFieldPermissions('productAttribute','read')" label="商品属性" required prop="productAttribute" borderBottom>
  118. <TabSelect :tabList="productAttributeList" :colNum="4" mode="single"
  119. :isClear="productAttributeIsClear" @tabChange="handleTabChangeProductAttribute"
  120. :echoInfo="echoInfoProductAttribute">
  121. </TabSelect>
  122. </up-form-item>
  123. <up-form-item v-if="getWarehouseFieldPermissions('stock','read')" label="库存数量" required prop="stock" class="u-form-item-row" borderBottom>
  124. <up-input v-model="formData.stock" placeholder="请输入" clearable border="none"
  125. type="number"></up-input>
  126. </up-form-item>
  127. <up-form-item v-if="getWarehouseFieldPermissions('price','read')" label="官方指导价" required prop="price" class="u-form-item-row" borderBottom>
  128. <up-input v-model="formData.price" placeholder="请输入" clearable border="none"></up-input>
  129. </up-form-item>
  130. <up-form-item v-if="getWarehouseFieldPermissions('costPrice','read')" label="总成本价" class="u-form-item-row" borderBottom>
  131. <up-input v-model="formData.costPrice" placeholder="请输入" clearable border="none"></up-input>
  132. </up-form-item>
  133. <up-form-item v-if="getWarehouseFieldPermissions('peerPrice','read')" label="同行价格" class="u-form-item-row" borderBottom>
  134. <up-input v-model="formData.peerPrice" placeholder="请输入" clearable border="none"></up-input>
  135. </up-form-item>
  136. <up-form-item v-if="getWarehouseFieldPermissions('actualPrice','read')" label="实价" class="u-form-item-row" borderBottom>
  137. <up-input v-model="formData.actualPrice" placeholder="请输入" clearable border="none" type="number" @blur="handleBlurActualPrice"></up-input>
  138. </up-form-item>
  139. <up-form-item v-if="getWarehouseFieldPermissions('agentPrice','read')" label="代理价格" class="u-form-item-row" borderBottom>
  140. <up-input v-model="formData.agentPrice" placeholder="请输入" clearable border="none"></up-input>
  141. </up-form-item>
  142. <up-form-item v-if="getWarehouseFieldPermissions('salePrice','read')" label="销售价格" class="u-form-item-row" borderBottom>
  143. <up-input v-model="formData.salePrice" placeholder="请输入" clearable border="none"></up-input>
  144. </up-form-item>
  145. <up-form-item v-if="getWarehouseFieldPermissions('productPosition','read')" label="商品位置" class="u-form-item-row" borderBottom>
  146. <up-input v-model="formData.productPosition" placeholder="请输入" clearable
  147. border="none"></up-input>
  148. </up-form-item>
  149. <up-form-item v-if="getWarehouseFieldPermissions('watchYear','read')" label="手表年份" class="u-form-item-row" borderBottom>
  150. <up-input v-model="formData.watchYear" placeholder="请输入" clearable border="none"></up-input>
  151. </up-form-item>
  152. <up-form-item v-if="getWarehouseFieldPermissions('identifyingPerson','read')" label="鉴定人员" class="u-form-item-row" borderBottom @click="identifyingPersonClick">
  153. <Cell :stop="false" :val="formData.identifyingPerson" :isDelete="true"
  154. @handleClear="clear('identifyingPerson')"></Cell>
  155. <PersonPicker ref="identifyingPersonPickerRef" title="请选择鉴定人员"
  156. @selectPerson="handleSelectIdentifyingPerson"></PersonPicker>
  157. </up-form-item>
  158. <up-form-item v-if="getWarehouseFieldPermissions('stockStatus','read')" label="是否入库" borderBottom required prop="stockStatus">
  159. <TabSelect :tabList="stockStatusList" :colNum="2" mode="single" :isClear="stockStatusIsClear" :echoInfo="echoInfoStockStatus"
  160. @tabChange="handleTabChangeStockStatus"></TabSelect>
  161. </up-form-item>
  162. <up-form-item v-if="getWarehouseFieldPermissions('recycleType','read')" label="回收类型" borderBottom>
  163. <TabSelect :tabList="recycleTypeList" :colNum="4" mode="single" :isClear="recycleTypeIsClear" :echoInfo="echoInfoRecycleType"
  164. @tabChange="handleTabChangeRecycleType">
  165. </TabSelect>
  166. </up-form-item>
  167. <up-form-item v-if="getWarehouseFieldPermissions('recycleSituation','read')" label="回收情况" borderBottom>
  168. <TabSelect :tabList="recycleSituationList" :colNum="5" mode="single" :isClear="recycleSituationIsClear" :echoInfo="echoInfoRecycleSituation"
  169. @tabChange="handleTabChangeRecycleSituation">
  170. </TabSelect>
  171. </up-form-item>
  172. <up-form-item v-if="getWarehouseFieldPermissions('label','read')" label="标签" borderBottom>
  173. <TabSelect :tabList="labelList" :colNum="5" mode="single" :isClear="labelIsClear" :echoInfo="echoInfoLabel"
  174. @tabChange="handleTabChangeLabel">
  175. </TabSelect>
  176. </up-form-item>
  177. <up-form-item v-if="getWarehouseFieldPermissions('recyclePerson','read')" label="回收人员" class="u-form-item-row" borderBottom @click="recyclePersonClick">
  178. <!-- <up-input v-model="formData.recyclePerson" disabledColor="#fff" disabled clearable
  179. border="none"></up-input> -->
  180. <Cell :stop="false" :val="formData.recyclePerson" :isDelete="true" @handleClear="clear('recyclePerson')"></Cell>
  181. <PersonPicker ref="recyclePersonPickerRef" title="请选择回收人员" @selectPerson="handleSelectRecyclePerson"></PersonPicker>
  182. </up-form-item>
  183. <up-form-item v-if="getWarehouseFieldPermissions('recycleBottomDesc','read') || getWarehouseFieldPermissions('recycleBottomFileList','read')" :label="'回收留底图(' + (formData.recycleBottomFileList.length || 0) + '张)'" borderBottom>
  184. <view class="recycle_bottom_desc">
  185. <up-textarea v-if="getWarehouseFieldPermissions('recycleBottomDesc','read')" v-model="formData.recycleBottomDesc" clearable count autoHeight maxlength="250"
  186. height="100" confirmType="done"></up-textarea>
  187. <view class="imgs_scroll" v-if="getWarehouseFieldPermissions('recycleBottomFileList','read')">
  188. <DragUpload ref="dragUpload" :images="formData.recycleBottomFileList" :isDelete="true" :isPreview="true" @imagesChanged="recycleBottomFileListImagesChanged" @uploadComplete="recycleBottomFileListUploadComplete"></DragUpload>
  189. <!-- <ImgsRowScroll v-if="formData.recycleBottomFileList.length > 0" :isShowDeleteIcon="true"
  190. @deleteImgInfo="getDeleteRecycleBottomPicInfo" imgMode="aspectFill"
  191. :totalWidth="400" :images="formData.recycleBottomFileList" :previewEnabled="true"
  192. :imageWidth="150" :imageHeight="150"></ImgsRowScroll>
  193. <up-upload @afterRead="afterReadRecycleBottom" name="1" multiple :maxCount="10"
  194. accept="image"></up-upload> -->
  195. </view>
  196. </view>
  197. </up-form-item>
  198. <up-form-item v-if="getWarehouseFieldPermissions('recycleTime','read')" label="回收时间" required prop="recycleTime" class="u-form-item-row" borderBottom
  199. @click="clickRecycleTimeRow">
  200. <Cell :stop="false" :val="formData.recycleTime"></Cell>
  201. <up-datetime-picker @confirm="confirmRecycleTime" @close="closeRecycleTimePicker"
  202. @cancel="closeRecycleTimePicker" :show="recycleTimeShow" v-model="formData.recycleTime"
  203. mode="date"></up-datetime-picker>
  204. </up-form-item>
  205. <up-form-item v-if="getWarehouseFieldPermissions('indentifyCode','read')" label="独立编码" class="u-form-item-row" borderBottom>
  206. <up-input v-model="formData.indentifyCode" placeholder="请输入" clearable border="none"></up-input>
  207. </up-form-item>
  208. <up-form-item v-if="getWarehouseFieldPermissions('targetAudience','read')" label="适用人群" class="u-form-item-row" borderBottom>
  209. <up-radio-group v-model="formData.targetAudience" placement="row">
  210. <up-radio activeColor="#3c9cff" name="general" label="通用"></up-radio>
  211. <up-radio activeColor="#3c9cff" name="man" label="男"></up-radio>
  212. <up-radio activeColor="#3c9cff" name="woman" label="女"></up-radio>
  213. </up-radio-group>
  214. </up-form-item>
  215. <up-form-item v-if="getWarehouseFieldPermissions('productCard','read')" label="商品保卡" class="u-form-item-row" borderBottom>
  216. <up-radio-group v-model="formData.productCard" placement="row">
  217. <up-radio activeColor="#3c9cff" name="has" label="有保卡"></up-radio>
  218. <up-radio activeColor="#3c9cff" name="no" label="无保卡"></up-radio>
  219. </up-radio-group>
  220. </up-form-item>
  221. <up-form-item label="保卡年份" class="u-form-item-row" borderBottom
  222. v-if="getWarehouseFieldPermissions('productCard','read') && formData.productCard === 'has'">
  223. <up-input v-model="formData.cardYear" placeholder="不填写默认空白保卡" clearable
  224. border="none"></up-input>
  225. </up-form-item>
  226. <up-form-item v-if="getWarehouseFieldPermissions('productCardPicFileList','read')" :label="'保卡图片或独立编码照片留底(' + (formData.productCardPicFileList.length || 0) + '张)'" borderBottom>
  227. <view class="imgs_scroll">
  228. <DragUpload ref="dragUpload" :images="formData.productCardPicFileList" :isDelete="true" :isPreview="true" @imagesChanged="productCardPicFileListImagesChanged" @uploadComplete="productCardPicFileListUploadComplete"></DragUpload>
  229. <!-- <ImgsRowScroll v-if="formData.productCardPicFileList.length > 0" :isShowDeleteIcon="true"
  230. @deleteImgInfo="getDeleteProductCardPicInfo" imgMode="aspectFill" :totalWidth="400"
  231. :images="formData.productCardPicFileList" :previewEnabled="true" :imageWidth="150"
  232. :imageHeight="150"></ImgsRowScroll>
  233. <up-upload @afterRead="afterReadProductCardPic" name="3" multiple :maxCount="10"
  234. :previewFullImage="true"></up-upload> -->
  235. </view>
  236. </up-form-item>
  237. <up-form-item v-if="getWarehouseFieldPermissions('productTag','read')" label="商品标签" class="u-form-item-row" borderBottom>
  238. <up-input v-model="formData.productTag" placeholder="请输入" clearable border="none"></up-input>
  239. </up-form-item>
  240. <up-form-item v-if="getWarehouseFieldPermissions('productAttachment','read')" label="商品附件" class="u-form-item-row" borderBottom>
  241. <up-input v-model="formData.productAttachment" placeholder="请输入" clearable
  242. border="none"></up-input>
  243. </up-form-item>
  244. <up-form-item v-if="getWarehouseFieldPermissions('productDesc','read') || getWarehouseFieldPermissions('productDescPicFileList','read')" :label="'备注(' + (formData.productDescPicFileList.length || 0) + '张)'" borderBottom>
  245. <view class="recycle_bottom_desc">
  246. <up-textarea v-if="getWarehouseFieldPermissions('productDesc','read')" v-model="formData.productDesc" clearable count autoHeight maxlength="250"
  247. height="100" confirmType="done"></up-textarea>
  248. <view class="imgs_scroll" v-if="getWarehouseFieldPermissions('productDescPicFileList','read')">
  249. <DragUpload ref="dragUpload" :images="formData.productDescPicFileList" :isDelete="true" :isPreview="true" @imagesChanged="productDescPicFileListImagesChanged" @uploadComplete="productDescPicFileListUploadComplete"></DragUpload>
  250. <!-- <ImgsRowScroll v-if="formData.productDescPicFileList.length > 0"
  251. :isShowDeleteIcon="true" @deleteImgInfo="getDeleteProductDescPicInfo"
  252. imgMode="aspectFill" :totalWidth="400" :images="formData.productDescPicFileList"
  253. :previewEnabled="true" :imageWidth="150" :imageHeight="150"></ImgsRowScroll>
  254. <up-upload @afterRead="afterReadProductDescPic" name="1" multiple :maxCount="10"
  255. accept="image"></up-upload> -->
  256. </view>
  257. </view>
  258. </up-form-item>
  259. <up-form-item v-if="getWarehouseFieldPermissions('payType','read')" label="付款方式" >
  260. <TabSelect :tabList="paymentTabList" :echoInfo="echoInfoPayType" :colNum="4" mode="single"
  261. :isClear="payTypeIsClear" @tabChange="handlePayTypeTabChange">
  262. </TabSelect>
  263. </up-form-item>
  264. </up-form>
  265. </view>
  266. </view>
  267. <view :class="['btn_group', {'col-2': formData.stockStatus == '1'}]">
  268. <up-button plain type="primary" @click="openInfoModal('onlyIn')">保存</up-button>
  269. <up-button type="primary" @click="openInfoModal('inAndUp')" v-if="formData.stockStatus == '1'">入库并上架</up-button>
  270. </view>
  271. <moreInfo ref="moreInfoRef" :moreOptions="moreOptions" @confirm="handleMoreInfoConfirm" :isCopy="true" :showCancelButton="true"></moreInfo>
  272. </view>
  273. </template>
  274. <script>
  275. import TabSelect from '@/components/custom-tab-select/index.vue'
  276. import Cell from '@/components/custom-cell/index.vue'
  277. import BrandList from '@/components/brand-list/index.vue'
  278. import ImgsRowScroll from '@/components/imgs-row-scroll/index.vue'
  279. import DragUpload from '@/components/drag-upload/index.vue'
  280. import PersonPicker from '@/components/person-picker/index.vue'
  281. import { getRoles,getWarehouseFieldPermissions,getWarehouseButtonPermissions } from '@/utils/util.js'
  282. import moreInfo from './moreInfo.vue'
  283. import { productConditionList,productAttributeList,stockStatusList,recycleTypeList,labelList,paymentTabList,recycleSituationList } from '../js/public.js'
  284. export default {
  285. components: {
  286. TabSelect,
  287. Cell,
  288. BrandList,
  289. ImgsRowScroll,
  290. PersonPicker,
  291. moreInfo,
  292. DragUpload
  293. },
  294. data() {
  295. return {
  296. checkboxValue: [''],
  297. recognitionContent: '',
  298. formData: {
  299. goodPicFileList: [],//商品图片
  300. desc: '',
  301. origin: '',
  302. type: '1',
  303. dictLabel: '艾美',
  304. dictValue: '88',
  305. series: '',
  306. model: '',
  307. dialType: '',
  308. caseMaterial: '',
  309. dialDiameter: '',
  310. material: '',
  311. size: '',
  312. yardage: '',
  313. price: 0,
  314. productCondition: '1',
  315. detailPicFileList: [],//细节图片
  316. // detailVideoFileList:[],
  317. title:'',
  318. productNo: '',
  319. productAttribute: '1',
  320. stock: 1,
  321. costPrice: '',
  322. peerPrice: '',
  323. actualPrice: '',
  324. agentPrice: '',
  325. salePrice: '',
  326. productPosition: '',
  327. watchYear: '',
  328. identifyingPerson: '',
  329. identifyingPersonId: '',
  330. stockStatus: '0',
  331. recycleType: '',
  332. recycleSituation: '0',
  333. recyclePerson: '',
  334. recyclePersonId: '',
  335. recycleBottomDesc: '',
  336. recycleBottomFileList: [],//回收留底图
  337. recycleTime: this.$dayjs().format('YYYY-MM-DD'),
  338. indentifyCode: '',
  339. targetAudience: '',
  340. productCard: '',
  341. cardYear: '',
  342. productCardPicFileList: [],//商品保卡图片或独立编码照片留底
  343. productTag: '',
  344. productAttachment: '',
  345. productDesc: '',
  346. productDescPicFileList: [],//商品备注图片
  347. payType: '',
  348. },
  349. continuousWarehousing: [],//是否连续入库 1:是 0:否
  350. rules: {
  351. goodPicFileList: [
  352. { required: true, message: '请上传商品图片' },
  353. ],
  354. desc: [
  355. { required: true, message: '请输入商品描述', trigger: ['blur', 'change'] },
  356. ],
  357. type: [
  358. { required: true, message: '请选择商品分类', trigger: ['blur', 'change'] },
  359. ],
  360. dictLabel: [
  361. { required: true, message: '请选择品牌', trigger: ['blur', 'change'] },
  362. ],
  363. model: [
  364. { required: true, message: '请输入型号', trigger: ['blur', 'change'] },
  365. ],
  366. productCondition: [
  367. { required: true, message: '请选择商品成色', trigger: ['blur', 'change'] },
  368. ],
  369. productAttribute: [
  370. { required: true, message: '请选择商品属性', trigger: ['blur', 'change'] },
  371. ],
  372. stock: [
  373. { required: true, message: '请输入库存数量' }
  374. ],
  375. price: [
  376. { required: true, message: '请输入官方指导价' }
  377. ],
  378. stockStatus: [
  379. { required: true, message: '请选择是否入库', trigger: [ 'change'] },
  380. ],
  381. recycleTime: [
  382. { required: true, message: '请选择回收时间', trigger: ['blur', 'change'] },
  383. ],
  384. },
  385. recycleTimeShow: false,
  386. titlePlaceholder: '如不填,自动截取商品描述前50字',
  387. typeList: [],
  388. typeIsClear: false,//商品分类是否清空
  389. productConditionIsClear: false,//商品成色是否清空
  390. productAttributeIsClear: false,//商品属性是否清空
  391. recycleTypeIsClear: false,//回收类型是否清空
  392. recycleSituationIsClear: false,//回收情况是否清空
  393. stockStatusIsClear: false,//是否入库是否清空
  394. labelIsClear: false,//商品标签是否清空
  395. payTypeIsClear: false,//付款方式是否清空
  396. echoInfoPayType: '',//付款方式识别回显
  397. echoInfoRecycleType:'',//入库回显的时候 回收类型回显
  398. echoInfoLabel:'',//入库回显的时候 商品标签回显
  399. echoInfoType:'',//入库回显的时候 类型回显
  400. echoInfoProductAttribute:'',//入库回显的时候 商品属性回显
  401. echoInfoProductCondition:'',//入库回显的时候 商品成色回显
  402. echoInfoStockStatus:'',//入库回显的时候 是否入库回显
  403. echoInfoRecycleSituation:'0',//入库回显的时候 回收情况回显
  404. formType: '',//表单类型 add:新增 edit:编辑
  405. xhlSystemSetList: [],//系统设置-列表
  406. productConditionList:productConditionList,
  407. productAttributeList: productAttributeList,
  408. stockStatusList: stockStatusList,
  409. recycleTypeList: recycleTypeList,
  410. labelList: labelList,
  411. paymentTabList: paymentTabList,
  412. recycleSituationList: recycleSituationList,
  413. moreOptions: {},
  414. }
  415. },
  416. onLoad(options) {
  417. this.getTypeList();
  418. this.getXhlSystemSetList()
  419. this.$nextTick(async()=>{
  420. this.formType = options.formType
  421. if(options.formType == 'add'){
  422. this.clearForm()
  423. }else if(options.formType == 'edit'){
  424. const res = await uni.$u.api.wareHouseDetail({
  425. id: options.id,
  426. userId: this.$store.state.user.userInfo.userId,
  427. })
  428. this.formData = res.data
  429. this.formData.recycleTime = res.data.recycleTime ? this.$dayjs(res.data.recycleTime).format('YYYY-MM-DD') : ''
  430. this.echoInfoType = res.data.type || '1'//商品分类回显
  431. this.formData.type = res.data.type || '1'//商品分类校验
  432. this.echoInfoProductAttribute = res.data.productAttribute || '1'//商品属性回显
  433. this.formData.productAttribute = res.data.productAttribute || '1'//商品属性校验
  434. this.echoInfoProductCondition = res.data.productCondition || '1'//商品成色回显
  435. this.formData.productCondition = res.data.productCondition || '1'//商品成色校验
  436. this.echoInfoStockStatus = res.data.stockStatus || '0'//是否入库回显
  437. this.formData.stockStatus = res.data.stockStatus || '0'//是否入库校验
  438. this.formData.stock = res.data.stock ? res.data.stock : 1//入库数量校验
  439. this.formData.price = res.data.price || 0//官方指导价校验
  440. this.echoInfoPayType = res.data.payType//付款方式回显
  441. this.echoInfoRecycleType = res.data.recycleType//回收类型回显
  442. this.echoInfoRecycleSituation = res.data.recycleSituation || '0'//回收情况回显
  443. this.echoInfoLabel = res.data.label//商品标签回显
  444. this.recognitionContent = `品牌:${res.data.dictLabel || ''}
  445. 来源:${res.data.origin || ''}
  446. 实价:${res.data.actualPrice || ''}
  447. 型号:${res.data.model || ''}
  448. 编码:${res.data.indentifyCode || ''}
  449. 日期:${res.data.cardYear || res.data.cardDate || ''}
  450. 备注:${res.data.productDesc || ''}
  451. 付款方式:${this.paymentTabList.find(item => item.value == res.data.payType)?.name || ''}
  452. `
  453. this.formData.desc = `99新,${[res.data.dictLabel, res.data.model, res.data.cardYear || res.data.cardDate, res.data.productDesc].filter(item => item).join('-')}`
  454. }
  455. })
  456. },
  457. methods: {
  458. getWarehouseFieldPermissions,
  459. getWarehouseButtonPermissions,
  460. getXhlSystemSetList(){
  461. uni.$u.api.xhlSystemSetList({
  462. pageNum: 1,
  463. pageSize: 99,
  464. }).then(res => {
  465. this.xhlSystemSetList = res.rows || []
  466. })
  467. },
  468. handleBlurActualPrice() {
  469. if (this.formData.actualPrice) {
  470. const actualPrice = Number(this.formData.actualPrice)
  471. let obj = {}
  472. // 查找包含SALEMAN字符的权限
  473. const roles = getRoles()
  474. const salesmanRole = roles.find(role => role.toUpperCase().includes('SALEMAN'))
  475. // 只要账号权限里面有包含SALEMAN的权限,就按照对应权限的计算规则,没有就固定计算
  476. if(salesmanRole){
  477. obj = this.xhlSystemSetList.find(item => item.agentType == salesmanRole) || {}
  478. }else{
  479. obj = {
  480. goodsRate: 0.003,
  481. goodsAmount: 500,
  482. }
  483. }
  484. this.formData.agentPrice = (actualPrice + actualPrice*obj.goodsRate + obj.goodsAmount).toFixed(2)
  485. }
  486. },
  487. getTypeList() {
  488. this.$getDicts("crm_form_category").then(res => {
  489. this.typeList = res
  490. })
  491. },
  492. openInfoModal(submitType) {
  493. this.$refs.addForm.validate().then(() => {
  494. this.submitType = submitType
  495. this.moreOptions = {
  496. dictLabel: this.formData.dictLabel || '',
  497. origin: this.formData.origin || '',
  498. actualPrice: this.formData.actualPrice || '',
  499. model: this.formData.model || '',
  500. indentifyCode: this.formData.indentifyCode || '',
  501. cardYear: this.formData.cardYear || '',
  502. productDesc: this.formData.productDesc || '',
  503. }
  504. this.$refs.moreInfoRef.showMoreInfo();
  505. })
  506. },
  507. handleMoreInfoConfirm() {
  508. if(!this.getWarehouseButtonPermissions('edit')) return false
  509. this.submitForm(this.submitType)
  510. },
  511. // 提交表单
  512. submitForm(submitType) {
  513. this.$refs.addForm.validate().then((valid) => {
  514. if (valid) {
  515. if (this.formData.title == '') {
  516. this.formData.title = this.formData.desc.substring(0, 50);
  517. }
  518. this.formData.recycleTime = this.$dayjs(this.formData.recycleTime).format('YYYY-MM-DD')
  519. const data = {
  520. ...this.formData,
  521. submitType: submitType, //提交类型 onlyIn:仅入库/暂存入库 inAndUp:入库并上架
  522. continuousWarehousing: this.continuousWarehousing[0] || '0',//是否连续入库 1:是 0:否
  523. }
  524. this.$refs.moreInfoRef.closeModal();
  525. if(this.formType == 'add'){
  526. uni.$u.api.wareHouseAdd(data).then(res => {
  527. uni.$u.toast('操作成功');
  528. if (data.continuousWarehousing == '0') {
  529. setTimeout(() => {
  530. // 发送事件通知列表页刷新数据
  531. uni.$emit('warehouse-data-updated');
  532. uni.navigateBack({
  533. delta: 1
  534. });
  535. }, 1000);
  536. } else {
  537. this.clearForm();
  538. }
  539. }).catch(err => {
  540. uni.$u.toast(err);
  541. })
  542. }else if(this.formType == 'edit'){
  543. uni.$u.api.wareHouseUpdate(data).then(res => {
  544. uni.$u.toast('操作成功');
  545. if (data.continuousWarehousing == '0') {
  546. setTimeout(() => {
  547. // 发送事件通知列表页刷新数据
  548. uni.$emit('warehouse-data-updated');
  549. uni.navigateBack({
  550. delta: 1
  551. });
  552. }, 1000);
  553. } else {
  554. this.clearForm();
  555. }
  556. }).catch(err => {
  557. uni.$u.toast(err);
  558. })
  559. }
  560. } else {
  561. console.log('表单校验不通过');
  562. }
  563. });
  564. },
  565. clearForm() {
  566. this.formData = {
  567. goodPicFileList: [],//商品图片
  568. desc: '',
  569. origin: '',
  570. type: '1',
  571. dictLabel: '艾美',
  572. dictValue: '88',
  573. series: '',
  574. model: '',
  575. dialType: '',
  576. caseMaterial: '',
  577. dialDiameter: '',
  578. material: '',
  579. size: '',
  580. yardage: '',
  581. price: 0,
  582. productCondition: '1',
  583. detailPicFileList: [],//细节图片
  584. // detailVideoFileList:[],
  585. productNo: '',
  586. productAttribute: '1',
  587. stock: 1,
  588. costPrice: '',
  589. samePrice: '',
  590. agentPrice: '',
  591. salePrice: '',
  592. productPosition: '',
  593. watchYear: '',
  594. identifyingPerson: '',
  595. identifyingPersonId: '',
  596. stockStatus: '0',
  597. recycleType: '',
  598. recycleSituation: '0',
  599. label: '',
  600. recyclePerson: '',
  601. recyclePersonId: '',
  602. recycleBottomDesc: '',
  603. recycleBottomFileList: [],//回收留底图
  604. recycleTime: this.$dayjs().format('YYYY-MM-DD'),
  605. indentifyCode: '',
  606. targetAudience: '',
  607. productCard: '',
  608. cardYear: '',
  609. productCardPicFileList: [],//商品保卡图片或独立编码照片留底
  610. productTag: '',
  611. productAttachment: '',
  612. productDesc: '',
  613. productDescPicFileList: [],//商品备注图片
  614. payType: '',
  615. }
  616. this.recycleTypeIsClear = true;
  617. this.payTypeIsClear = true;
  618. this.labelIsClear = true;
  619. this.echoInfoType = '1';//类型默认第一项
  620. this.echoInfoProductCondition = '1';//商品成色默认第一项
  621. this.echoInfoProductAttribute = '1';//商品属性默认第一项
  622. this.echoInfoStockStatus = '0';//是否入库默认第一项
  623. this.continuousWarehousing = [];
  624. this.$nextTick(()=>{
  625. this.$refs.addForm.resetFields();
  626. })
  627. },
  628. // 选择品牌
  629. handleSelectedBrand(info) {
  630. this.formData.dictLabel = info.dictLabel;
  631. this.formData.dictValue = info.dictValue;
  632. this.$refs.addForm.validateField('dictLabel');
  633. },
  634. // 显示品牌列表
  635. showBrandList() {
  636. this.$refs.brandListRef.showBrandList();
  637. },
  638. // 清空输入框
  639. clear(key) {
  640. // 品牌
  641. if (key == 'dictLabel') {
  642. this.formData.dictLabel = '';
  643. this.formData.dictValue = '';
  644. return;
  645. }
  646. // 鉴定人
  647. if (key == 'identifyingPerson') {
  648. this.formData.identifyingPerson = '';
  649. this.formData.identifyingPersonId = '';
  650. return;
  651. }
  652. // 回收人
  653. if (key == 'recyclePerson') {
  654. this.formData.recyclePerson = '';
  655. this.formData.recyclePersonId = '';
  656. return;
  657. }
  658. this.formData[key] = '';
  659. },
  660. // 商品分类
  661. handleTabChangeType(e) {
  662. this.formData.type = e;
  663. this.$refs.addForm.validateField('type')
  664. },
  665. // 商品成色
  666. handleTabChangeProductCondition(e) {
  667. this.formData.productCondition = e;
  668. this.$refs.addForm.validateField('productCondition')
  669. },
  670. // 商品属性
  671. handleTabChangeProductAttribute(e) {
  672. this.formData.productAttribute = e;
  673. this.$refs.addForm.validateField('productAttribute')
  674. },
  675. // 是否入库
  676. handleTabChangeStockStatus(e) {
  677. this.formData.stockStatus = e;
  678. },
  679. // 回收类型
  680. handleTabChangeRecycleType(e) {
  681. this.formData.recycleType = e;
  682. },
  683. // 回收情况
  684. handleTabChangeRecycleSituation(e) {
  685. this.formData.recycleSituation = e;
  686. },
  687. // 商品标签
  688. handleTabChangeLabel(e) {
  689. this.formData.label = e;
  690. },
  691. // 付款方式
  692. handlePayTypeTabChange(e) {
  693. this.formData.payType = e;
  694. },
  695. // 打开回收时间选择器
  696. clickRecycleTimeRow() {
  697. this.recycleTimeShow = true;
  698. },
  699. // 确认回收时间
  700. confirmRecycleTime(val) {
  701. this.$nextTick(() => {
  702. this.formData.recycleTime = this.$dayjs(val.value).format('YYYY-MM-DD');
  703. this.recycleTimeShow = false;
  704. })
  705. },
  706. // 关闭回收时间选择器
  707. closeRecycleTimePicker(val) {
  708. this.recycleTimeShow = false;
  709. },
  710. // 打开鉴定人选择器
  711. identifyingPersonClick() {
  712. this.$refs.identifyingPersonPickerRef.open();
  713. },
  714. // 选择鉴定人
  715. handleSelectIdentifyingPerson(info) {
  716. this.formData.identifyingPerson = info.label;
  717. this.formData.identifyingPersonId = info.id;
  718. },
  719. // 打开回收人选择器
  720. recyclePersonClick() {
  721. this.$refs.recyclePersonPickerRef.open();
  722. },
  723. // 选择回收人
  724. handleSelectRecyclePerson(info) {
  725. this.formData.recyclePerson = info.label;
  726. this.formData.recyclePersonId = info.id;
  727. },
  728. // 商品图片拖拽完成
  729. goodPicFileListImagesChanged(info) {
  730. this.formData.goodPicFileList = info
  731. },
  732. // 商品图片上传完成
  733. goodPicFileListUploadComplete(info) {
  734. this.formData.goodPicFileList = info
  735. },
  736. // 细节图片拖拽完成
  737. detailPicFileListImagesChanged(info) {
  738. this.formData.detailPicFileList = info
  739. },
  740. // 细节图片上传完成
  741. detailPicFileListUploadComplete(info) {
  742. this.formData.detailPicFileList = info
  743. },
  744. // 回收留底图拖拽完成
  745. recycleBottomFileListImagesChanged(info) {
  746. this.formData.recycleBottomFileList = info
  747. },
  748. // 回收留底图上传完成
  749. recycleBottomFileListUploadComplete(info) {
  750. this.formData.recycleBottomFileList = info
  751. },
  752. // 商品保卡图片拖拽完成
  753. productCardPicFileListImagesChanged(info) {
  754. this.formData.productCardPicFileList = info
  755. },
  756. // 商品保卡图片上传完成
  757. productCardPicFileListUploadComplete(info) {
  758. this.formData.productCardPicFileList = info
  759. },
  760. // 商品描述图片拖拽完成
  761. productDescPicFileListImagesChanged(info) {
  762. this.formData.productDescPicFileList = info
  763. },
  764. // 商品描述图片上传完成
  765. productDescPicFileListUploadComplete(info) {
  766. this.formData.productDescPicFileList = info
  767. },
  768. // 新增商品图片
  769. // async afterReadGoodPic(event) {
  770. // event.file.forEach(item => {
  771. // uni.$u.api.uploadFile(item.url).then((res) => {
  772. // this.formData.goodPicFileList.push(res.data.url);
  773. // uni.$u.toast("文件上传成功");
  774. // }).catch(() => {
  775. // uni.$u.toast("上传文件失败");
  776. // })
  777. // })
  778. // },
  779. // // 获取删除商品图片信息
  780. // getDeleteGoodPicInfo(info) {
  781. // this.formData.goodPicFileList = info.newImages
  782. // },
  783. // // 获取删除细节图片信息
  784. // getDeleteDetailPicInfo(info) {
  785. // this.formData.detailPicFileList = info
  786. // },
  787. // // 新增细节图片
  788. // async afterReadDetailPic(event) {
  789. // event.file.forEach(item => {
  790. // uni.$u.api.uploadFile(item.url).then((res) => {
  791. // this.formData.detailPicFileList.push(res.data.url);
  792. // uni.$u.toast("文件上传成功");
  793. // }).catch(() => {
  794. // uni.$u.toast("上传文件失败");
  795. // })
  796. // })
  797. // },
  798. // 获取删除回收留底图信息
  799. // getDeleteRecycleBottomPicInfo(info) {
  800. // this.formData.recycleBottomFileList = info.newImages
  801. // },
  802. // // 新增回收留底图
  803. // async afterReadRecycleBottom(event) {
  804. // event.file.forEach(item => {
  805. // uni.$u.api.uploadFile(item.url).then((res) => {
  806. // this.formData.recycleBottomFileList.push(res.data.url);
  807. // uni.$u.toast("文件上传成功");
  808. // }).catch(() => {
  809. // uni.$u.toast("上传文件失败");
  810. // })
  811. // })
  812. // },
  813. // // 删除商品保卡图片或独立编码照片留底
  814. // getDeleteProductCardPicInfo(info) {
  815. // this.formData.productCardPicFileList = info.newImages
  816. // },
  817. // // 新增商品保卡图片或独立编码照片留底
  818. // async afterReadProductCardPic(event) {
  819. // event.file.forEach(item => {
  820. // uni.$u.api.uploadFile(item.url).then((res) => {
  821. // this.formData.productCardPicFileList.push(res.data.url);
  822. // uni.$u.toast("文件上传成功");
  823. // }).catch(() => {
  824. // uni.$u.toast("上传文件失败");
  825. // })
  826. // })
  827. // },
  828. // // 获取删除商品备注图片信息
  829. // getDeleteProductDescPicInfo(info) {
  830. // this.formData.productDescPicFileList = info.newImages
  831. // },
  832. // // 新增商品备注图片
  833. // async afterReadProductDescPic(event) {
  834. // event.file.forEach(item => {
  835. // uni.$u.api.uploadFile(item.url).then((res) => {
  836. // this.formData.productDescPicFileList.push(res.data.url);
  837. // uni.$u.toast("文件上传成功");
  838. // }).catch(() => {
  839. // uni.$u.toast("上传文件失败");
  840. // })
  841. // })
  842. // },
  843. async handlePasteRecognition(text) {
  844. // 品牌:浪琴
  845. // 来源:【麒麟】私信-杰3-3
  846. // 实价:6500
  847. // 型号:L2.257.5.89.7
  848. // 编码:52356065
  849. // 日期:2021-11-09
  850. // 备注:全套
  851. // 付款方式:微信
  852. if (!text) {
  853. return;
  854. }
  855. try {
  856. if (!text) return {};
  857. const result = {};
  858. // 支持中文冒号和英文冒号
  859. const lines = text.split(/[\n\r]+/);
  860. lines.forEach(line => {
  861. const lineStr = line.trim();
  862. if (!lineStr) return;
  863. // 尝试中文冒号
  864. let separatorIndex = lineStr.indexOf(':');
  865. // 如果没有中文冒号,尝试英文冒号
  866. if (separatorIndex === -1) {
  867. separatorIndex = lineStr.indexOf(':');
  868. }
  869. if (separatorIndex > 0) {
  870. const key = lineStr.substring(0, separatorIndex).trim();
  871. const value = lineStr.substring(separatorIndex + 1).trim();
  872. result[key] = value;
  873. }
  874. });
  875. if (result['品牌']) {
  876. this.formData.dictLabel = result['品牌'];
  877. }
  878. if (result['来源']) {
  879. this.formData.origin = result['来源'];
  880. }
  881. if (result['实价']) {
  882. this.formData.actualPrice = result['实价'];
  883. }
  884. if (result['型号']) {
  885. this.formData.model = result['型号'];
  886. }
  887. if (result['编码']) {
  888. this.formData.indentifyCode = result['编码'];
  889. }
  890. if (result['日期']) {
  891. this.formData.cardYear = result['日期'];
  892. }
  893. if (result['备注']) {
  894. this.formData.productDesc = result['备注'];
  895. }
  896. if (result['付款方式']) {
  897. this.getPaymentType(result['付款方式'])
  898. this.formData.payType = result['付款方式'];
  899. }
  900. // return result;
  901. } catch (e) {
  902. uni.$u.toast("文本识别异常");
  903. }
  904. },
  905. // 清空识别内容
  906. clearRecognitionContent() {
  907. this.recognitionContent = '';
  908. },
  909. // 识别内容 回显付款方式
  910. getPaymentType(val) {
  911. let arr = []
  912. this.paymentTabList.filter(item => {
  913. if (item.name == val) arr.push(item.value)
  914. })
  915. if (arr.length > 0) {
  916. this.echoInfoPayType = arr[0]
  917. }
  918. }
  919. }
  920. }
  921. </script>
  922. <style lang="scss" scoped>
  923. @import '../styles/edit.scss';
  924. </style>