OrderOptional.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. import React, { Component } from 'react'
  2. import {
  3. View,
  4. Dimensions,
  5. FlatList,
  6. TouchableOpacity,
  7. Text,
  8. StyleSheet,
  9. PixelRatio,
  10. } from 'react-native'
  11. import { NavigationActions, createAction } from '../../../utils'
  12. import Icon from '../../../components/Iconfont/Iconfont'
  13. import ModalEcx from '../../../components/Modal'
  14. import OptFlatList from '../../commodity/commoditydetail/OptFlatList'
  15. import Toast from 'react-native-root-toast'
  16. const { width, height } = Dimensions.get('window')
  17. class OrderOptional extends Component {
  18. constructor(props) {
  19. super(props)
  20. this.state = {
  21. data: [],
  22. optionAttrs: [],
  23. }
  24. }
  25. _closeModal() {
  26. this.optional._setModalVisible(false)
  27. }
  28. _openModal = (value, isAll) => {
  29. this.optional._setModalVisible(true)
  30. const chooseOpt = this.props.optDataByIds
  31. let optionDatas = [],
  32. optionDataChoose = [],
  33. goodId = ''
  34. isAll
  35. ? // 点击全部
  36. (goodId = value.goodsId || value.parentGoodsId)
  37. : // 点击各自
  38. (goodId = value.goodsId || value.childGoodsId)
  39. //
  40. this.props
  41. .dispatch(createAction('optional/optionalByGoodIdSaga')(goodId))
  42. .finally(() => {
  43. optionDatas = this.props.optDataByGoodId
  44. if (value.reqOrderItemBoms && value.reqOrderItemBoms.length > 0) {
  45. value.reqOrderItemBoms.map(dataFst => {
  46. optionDatas.forEach(dataSec => {
  47. if (dataFst.childGoodsId == dataSec.id) {
  48. dataFst.goodsAttrVals = dataSec.goodsAttrVals
  49. }
  50. })
  51. })
  52. optionDataChoose = value.reqOrderItemBoms
  53. // this.setState({ data:optionDataChoose});
  54. } else {
  55. value.goodsAttrVals = optionDatas[0].goodsAttrVals
  56. optionDataChoose = [].concat(value)
  57. // this.setState({ data: optionDataChoose });
  58. }
  59. optionDataChoose.forEach(item => {
  60. item.newGoodsAttrVals = this.combineAttr(item.goodsAttrVals)
  61. })
  62. // 匹配之前选中 (两层数据做比较,每个数据有两层 ----待优化)
  63. if (optionDataChoose && optionDataChoose.length > 1) {
  64. optionDataChoose.forEach(dataFir => {
  65. chooseOpt.forEach(optFir => {
  66. if (dataFir.childGoodsId == optFir.goodsId) {
  67. dataFir.newGoodsAttrVals.forEach(dataSec => {
  68. if (dataSec.isOptionalAttr) {
  69. dataSec.item.forEach(dataTh => {
  70. optFir.goodsOptVals.forEach(optSec => {
  71. if (
  72. dataTh.prodAttrStrucItemId ==
  73. optSec.prodAttrStrucItemId
  74. ) {
  75. dataSec.isChoose = optSec
  76. if (dataSec.productAttrTypeCode == '04') {
  77. dataTh.attrValId = dataSec.isChoose.attrValId
  78. dataTh.attrValCode = dataSec.isChoose.attrValCode
  79. dataTh.attrValName = dataSec.isChoose.attrValName
  80. }
  81. if (dataTh.attrValId == optSec.attrValId) {
  82. dataTh.isChecked = true
  83. }
  84. }
  85. })
  86. })
  87. }
  88. })
  89. }
  90. })
  91. })
  92. }
  93. this.setState({ data: optionDataChoose })
  94. })
  95. // 添加Bom信息
  96. this.props.onPressBom()
  97. }
  98. // 选配请求参数
  99. optionalPostModel() {
  100. let returnArr = [],
  101. newArr = { goodsOptDtos: [] },
  102. alertText = []
  103. this.state.data.forEach(FirData => {
  104. let optResult = [],
  105. goodsAttrsObj = {},
  106. goodsOptVals = []
  107. FirData.newGoodsAttrVals.forEach(item => {
  108. if (item.isOptionalAttr) {
  109. if (item && item.isChoose && Object.keys(item.isChoose).length > 0) {
  110. goodsAttrsObj[
  111. item.isChoose.name ||
  112. item.name ||
  113. item.isChoose.prodAttrStrucItemName
  114. ] =
  115. item.isChoose.attrValName
  116. goodsOptVals.push({
  117. attrValCode: item.isChoose.attrValCode,
  118. attrValId: item.isChoose.attrValId,
  119. attrValName: item.isChoose.attrValName,
  120. goodsOptId: item.isChoose.id,
  121. prodAttrStrucItemId: item.isChoose.prodAttrStrucItemId,
  122. prodAttrStrucItemName:
  123. item.isChoose.name || item.isChoose.prodAttrStrucItemName,
  124. })
  125. optResult.push(
  126. `${item.isChoose.name ||
  127. item.name ||
  128. item.isChoose.prodAttrStrucItemName}:${
  129. item.isChoose.attrValName
  130. }`
  131. )
  132. } else {
  133. alertText.push(item.name)
  134. }
  135. } else {
  136. optResult.push(
  137. item.item.map(SecData => {
  138. goodsAttrsObj[SecData.name] = SecData.attrValName
  139. goodsOptVals.push({
  140. attrValCode: SecData.attrValCode,
  141. attrValId: SecData.attrValId,
  142. attrValName: SecData.attrValName,
  143. goodsOptId: SecData.id,
  144. prodAttrStrucItemId: SecData.prodAttrStrucItemId,
  145. prodAttrStrucItemName: SecData.name,
  146. })
  147. return `${SecData.name}:${SecData.attrValName}`
  148. })
  149. )
  150. }
  151. })
  152. const returnData = {
  153. goodsId: FirData.goodsId || FirData.childGoodsId,
  154. optResult: optResult.join(),
  155. uniqueKey: FirData.goodsId,
  156. goodsOptVals: goodsOptVals,
  157. }
  158. returnArr = { ...returnData, ...goodsAttrsObj }
  159. // returnArr.push({ ...returnData, ...goodsAttrsObj });
  160. newArr.goodsOptDtos = newArr.goodsOptDtos.concat(returnArr)
  161. })
  162. return { newArr, alertText }
  163. }
  164. confirmOpt() {
  165. // let postData = [].concat(this.optionalPostModel());
  166. let postData = this.optionalPostModel()
  167. if (postData && postData.alertText && postData.alertText.length > 0) {
  168. if (this.toast) {
  169. Toast.hide(this.toast)
  170. }
  171. this.toast = Toast.show(
  172. `选配项:'${postData.alertText.join()}'没有选择`,
  173. { position: toastHeight }
  174. )
  175. } else {
  176. this.props
  177. .dispatch(createAction('optional/saveOptionalSaga')([postData.newArr]))
  178. .finally(() => {
  179. if (
  180. this.props.optionalReturn &&
  181. this.props.optionalReturn.length > 0
  182. ) {
  183. const cbReturn = []
  184. let cbData = {}
  185. this.props.optionalReturn.forEach(firData => {
  186. firData.goodsOptDtos.forEach(secData => {
  187. cbData = { parentId: '', optIds: [], optVals: '' }
  188. cbData.goodsId = secData.goodsId
  189. cbData.optVals = secData.optResult
  190. cbData.optIds.push(secData.id)
  191. cbData.optIds = cbData.optIds.join()
  192. cbReturn.push(cbData)
  193. })
  194. })
  195. this.props.optCb(cbReturn)
  196. this._closeModal()
  197. }
  198. })
  199. }
  200. }
  201. // 对特征属性合并
  202. combineAttr(optionalAtts) {
  203. let obj = {},
  204. result = []
  205. // 对特征属性合并
  206. optionalAtts.map(item => {
  207. obj[item.productAttrId]
  208. ? obj[item.productAttrId].push(item)
  209. : (obj[item.productAttrId] = [].concat(item))
  210. })
  211. // productAttrId
  212. for (let i in obj) {
  213. result.push({
  214. name: obj[i].length > 0 && obj[i][0].name,
  215. typeCode: obj[i].length > 0 && obj[i][0].productAttrTypeCode,
  216. id: i,
  217. prodAttrStrucItemId: obj[i][0].prodAttrStrucItemId,
  218. item: obj[i],
  219. isOptionalAttr: obj[i][0].isOptionalAttr,
  220. productAttrTypeCode: obj[i][0].productAttrTypeCode,
  221. })
  222. }
  223. return result
  224. }
  225. OrderOpt(item) {
  226. // const newGoodsAttrVals = this.combineAttr(item.goodsAttrVals);
  227. // item.newGoodsAttrVals = newGoodsAttrVals;
  228. if (item.isOptional) {
  229. return (
  230. <OptFlatList
  231. havaOpt={true}
  232. {...this.props}
  233. optionData={item}
  234. chooseOpt={this.props.optDataByIds.filter(
  235. filData => filData.goodsId == item.childGoodsId
  236. )}
  237. />
  238. )
  239. }
  240. }
  241. _renderModalContent() {
  242. return (
  243. <View
  244. style={{
  245. width: width,
  246. height: height * 0.9,
  247. backgroundColor: '#FFF',
  248. paddingTop: 38,
  249. }}
  250. >
  251. <TouchableOpacity
  252. onPress={() => {
  253. this._closeModal()
  254. // this.props.cb && this.props.cb();
  255. }}
  256. style={{ position: 'absolute', right: 5, top: 5 }}
  257. >
  258. <Icon name="icon-icon-guanbianniu" size={30} color={'#CCC'} />
  259. </TouchableOpacity>
  260. <View style={{ flex: 1 }}>
  261. <FlatList
  262. keyExtractor={(item, index) => index}
  263. data={this.state.data}
  264. extraData={this.state}
  265. style={{ padding: 10 }}
  266. renderItem={({ item, index }) => this.OrderOpt(item, index)}
  267. />
  268. </View>
  269. <TouchableOpacity
  270. onPress={() => {
  271. this.confirmOpt()
  272. }}
  273. style={{
  274. backgroundColor: '#E70013',
  275. height: 45,
  276. justifyContent: 'center',
  277. alignItems: 'center',
  278. }}
  279. >
  280. <Text style={{ fontSize: 14, lineHeight: 20, color: '#FFF' }}>
  281. 确定
  282. </Text>
  283. </TouchableOpacity>
  284. </View>
  285. )
  286. }
  287. render() {
  288. return (
  289. <ModalEcx
  290. ref={optional => (this.optional = optional)}
  291. content={this._renderModalContent()}
  292. />
  293. )
  294. }
  295. }
  296. const styles = StyleSheet.create({
  297. titleText: {
  298. fontSize: 14,
  299. lineHeight: 20,
  300. color: '#999',
  301. },
  302. contentText: {
  303. flex: 1,
  304. fontSize: 13,
  305. lineHeight: 18,
  306. color: '#333',
  307. },
  308. })
  309. export default OrderOptional