Browse Source

收费类型

qzyReal 2 years ago
parent
commit
68b2cb98b7

+ 1 - 1
app/manifest.json

@@ -85,7 +85,7 @@
     "vueVersion" : "2",
     "h5" : {
         "router" : {
-            "base" : "/test/",
+            "base" : "/h5/",
             "mode" : "history"
         },
         "devServer" : {

+ 2 - 0
app/pages/onely-disinfect/type-business-edit.vue

@@ -206,6 +206,8 @@
 				this.form.carType = this.type.list[this.type.index]
 				if(this.customerId=='1'){
 					this.form.customerId = this.customer.list[this.customer.index].id;
+				}else{
+					this.form.customerId=this.customerId
 				}
 				let that = this;
 				let content = '确认修改该业务'

+ 4 - 2
app/pages/onely-disinfect/type-business.vue

@@ -127,10 +127,10 @@
 				return price;
 			}
 		},
-
 		onLoad(options) {
 			let customerId = uni.getStorageSync('customerId');
-			this.form.customerId = customerId;
+			console.log(customerId)
+			this.customerId = customerId;
 			let typeId = options.typeId;
 			this.itemType.id = typeId;
 			this.getItemType();
@@ -197,6 +197,8 @@
 				let list = itemList.filter(obj => checkList.indexOf(obj.id) !== -1);
 				if(this.customerId=='1'){
 					this.form.customerId = this.customer.list[this.customer.index].id;
+				}else{
+					this.form.customerId=this.customerId
 				}
 				this.form.itemTypeId = this.itemType.id;
 				this.form.items = list;

+ 2 - 2
app/utils/request.js

@@ -1,5 +1,5 @@
-// const server = 'http://127.0.0.1:8099/pro';
-const server = 'https://pco.aseanbusiness.cn/pro';
+const server = 'http://127.0.0.1:8099/pro';
+// const server = 'https://pco.aseanbusiness.cn/pro';
 // const server = 'https://dxkaa1.bgigc.com/pro';
 
 import common from '../common/js/common.js';

+ 66 - 22
sp-admin/sa-view/tb-item-type/tb-item-add.html

@@ -25,7 +25,7 @@
 			}
 
 			.item-num .el-input__inner {
-				width: 100px;
+				width: 130px;
 				display: inline;
 			}
 		</style>
@@ -39,40 +39,51 @@
 					<div class="c-title" v-else>数据修改</div>
 					<el-form v-if="m">
 						<sa-item type="text" name="明细名称" v-model="m.itemName" placeholder="请输入项目名称" br></sa-item>
-						<sa-td name="业务分类" prop="businessType" width="200px">
-							<template slot-scope="s">
-								<el-select :disabled="!sa.isAuth('tb-item-type-edit')" multiple v-model="s.row.type"
-									placeholder="收费项" @change="businessChange(s.row)">
-									<el-option v-for="item in businessTypeList" :key="item.value" :value="item.value"
-										:label="item.name">
-									</el-option>
-								</el-select>
-							</template>
-						</sa-td>
+						<div class="c-item">
+							<label class="c-label">业务分类:</label>
+							<el-select v-model="m.businessType">
+								<el-option v-for="item in businessTypeList" :key="item.id" :value="item.id"
+									:label="item.name">
+								</el-option>
+							</el-select>
+						</div>
+						<div class="c-item">
+							<label class="c-label">收费分类:</label>
+							<el-select v-model="m.payType">
+								<el-option v-for="item in payTypeList" :key="item.id" :value="item.id"
+									:label="item.name">
+								</el-option>
+							</el-select>
+						</div>
 						<sa-item type="text" name="计价单位" v-model="m.unit" placeholder="请输入计量单位" br></sa-item>
 						<div class="c-item">
 							<label class="c-label">计费金额(元):</label>
-							<el-input-number class="item-num" v-model="m.price" :step="10" :min="0" :max="9999"
-								></el-input-number>
+							<el-input-number class="item-num" v-model="m.price" :step="10" :min="1" :max="9999">
+							</el-input-number>
+						</div>
+						<div class="c-item">
+							<label class="c-label">税率(%):</label>
+							<el-input-number class="item-num" v-model="m.taxRate" :step="0.1" :min="0.01" :max="100">
+							</el-input-number>
 						</div>
 						<div>
 							<label>适用载重(kg):</label>
 							<div style="display: inline;margin-left: 20px;">
-								<el-input-number class="item-num" v-model="m.minWeight" :step="1" :min="0" :max="999999"
-									></el-input-number>
+								<el-input-number class="item-num" v-model="m.minWeight" :step="1" :min="1"
+									:max="999999"></el-input-number>
-								<el-input-number class="item-num" v-model="m.maxWeight" :step="1" :min="0" :max="9999999"
-									></el-input-number>
+								<el-input-number class="item-num" v-model="m.maxWeight" :step="1" :min="0"
+									:max="9999999"></el-input-number>
 							</div>
 						</div>
 						<div style="margin-top: 20px;">
 							<label>适用车长(米):</label>
 							<div style="display: inline;margin-left: 20px;">
-								<el-input-number class="item-num" v-model="m.minLength" :step="1" :min="0" :max="99"
-									></el-input-number>
+								<el-input-number class="item-num" v-model="m.minLength" :step="1" :min="0" :max="99">
+								</el-input-number>
-								<el-input-number class="item-num" v-model="m.carLength" :step="1" :min="0" :max="99"
-									></el-input-number>
+								<el-input-number class="item-num" v-model="m.carLength" :step="1" :min="0" :max="99">
+								</el-input-number>
 							</div>
 						</div>
 					</el-form>
@@ -95,7 +106,10 @@
 					m: {
 						id: '', // 主键
 						itemName: '',
-						price: '',
+						price: '400',
+						payType: '',
+						taxRate:6,
+						businessType: '',
 						unit: '元/车',
 						minLength: '4.2',
 						carLength: '20', //车长
@@ -104,8 +118,28 @@
 						status: '1', //转态
 					}, // 实体对象
 					itemTypeList: [],
+					payTypeList: [],
+					businessTypeList: []
 				},
 				methods: {
+					getBusinessTypeList() {
+						sa.ajax('/TbCostomer/getTypeList', function(resp) {
+							let list = resp.data;
+							if (list.length > 0) {
+								this.m.businessType = list[0].id
+							}
+							this.businessTypeList = list
+						}.bind(this))
+					},
+					getPayTypeList() {
+						sa.ajax('/TbFeeStatistics/getFeeType', function(resp) {
+							let list = resp.data;
+							if (list.length > 0) {
+								this.m.payType = list[0].id
+							}
+							this.payTypeList = list.filter(obj => obj.id !== 4);
+						}.bind(this))
+					},
 					// 提交数据 
 					ok: function() {
 						// 表单校验 
@@ -130,6 +164,14 @@
 							sa.error('最小载重不能大于最大载重')
 							return;
 						}
+						let payTypeList = this.payTypeList;
+						let payType = payTypeList.filter(obj => obj.id == m.payType).pop();
+						m.payType = payType.id;
+						m.payTypeName = payType.name;
+						let businessTypeList = this.businessTypeList;
+						let businessType = businessTypeList.filter(obj => obj.id == m.businessType).pop();
+						m.businessType = businessType.id;
+						m.businessTypeName = businessType.name;
 						// 开始增加或修改
 						if (this.id <= 0) { // 添加
 							sa.ajax('/TbItem/add', m, function(res) {
@@ -159,6 +201,8 @@
 							}
 						}.bind(this))
 					}
+					this.getBusinessTypeList();
+					this.getPayTypeList();
 				}
 			})
 		</script>

+ 193 - 0
sp-admin/sa-view/tb-item-type/tb-item-edit.html

@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<title>作业配置项-添加/修改</title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta name="viewport"
+			content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<!-- 所有的 css js 资源 -->
+		<link rel="stylesheet" href="../../static/kj/element-ui/theme-chalk/index.css">
+		<link rel="stylesheet" href="../../static/sa.css">
+		<script src="../../static/kj/vue.min.js"></script>
+		<script src="../../static/kj/element-ui/index.js"></script>
+		<script src="../../static/kj/httpVueLoader.js"></script>
+		<script src="../../static/kj/jquery.min.js"></script>
+		<script src="../../static/kj/layer/layer.js"></script>
+		<script src="../../static/sa.js"></script>
+		<style type="text/css">
+			.c-panel .el-form .c-label {
+				width: 7em !important;
+			}
+
+			.c-panel .el-form .el-input,
+			.c-panel .el-form .el-textarea__inner {
+				width: 250px;
+			}
+
+			.item-num .el-input__inner {
+				width: 130px;
+				display: inline;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="vue-box" :class="{sbot: id}" style="display: none;" :style="'display: block;'">
+			<!-- ------- 内容部分 ------- -->
+			<div class="s-body">
+				<div class="c-panel">
+					<div class="c-title" v-if="id == 0">数据添加</div>
+					<div class="c-title" v-else>数据修改</div>
+					<el-form v-if="m">
+						<sa-item type="text" name="明细名称" v-model="m.itemName" placeholder="请输入项目名称" br></sa-item>
+						<div class="c-item">
+							<label class="c-label">业务分类:</label>
+							<el-select v-model="m.businessType">
+								<el-option v-for="item in businessTypeList" :key="item.id" :value="item.id"
+									:label="item.name">
+								</el-option>
+							</el-select>
+						</div>
+						<div class="c-item">
+							<label class="c-label">收费分类:</label>
+							<el-select v-model="m.payType">
+								<el-option v-for="item in payTypeList" :key="item.id" :value="item.id"
+									:label="item.name">
+								</el-option>
+							</el-select>
+						</div>
+						<sa-item type="text" name="计价单位" v-model="m.unit" placeholder="请输入计量单位" br></sa-item>
+						<div class="c-item">
+							<label class="c-label">计费金额(元):</label>
+							<el-input-number class="item-num" v-model="m.price" :step="10" :min="1" :max="9999">
+							</el-input-number>
+						</div>
+						<div class="c-item">
+							<label class="c-label">税率(%):</label>
+							<el-input-number class="item-num" v-model="m.taxRate" :step="0.1" :min="0.01" :max="100">
+							</el-input-number>
+						</div>
+						<div>
+							<label>适用载重(kg):</label>
+							<div style="display: inline;margin-left: 20px;">
+								<el-input-number class="item-num" v-model="m.minWeight" :step="1" :min="1"
+									:max="999999"></el-input-number>
+								至
+								<el-input-number class="item-num" v-model="m.maxWeight" :step="1" :min="0"
+									:max="9999999"></el-input-number>
+							</div>
+						</div>
+						<div style="margin-top: 20px;">
+							<label>适用车长(米):</label>
+							<div style="display: inline;margin-left: 20px;">
+								<el-input-number class="item-num" v-model="m.minLength" :step="1" :min="0" :max="99">
+								</el-input-number>
+								至
+								<el-input-number class="item-num" v-model="m.carLength" :step="1" :min="0" :max="99">
+								</el-input-number>
+							</div>
+						</div>
+					</el-form>
+				</div>
+			</div>
+			<!-- ------- 底部按钮 ------- -->
+			<div class="s-foot">
+				<el-button type="primary" @click="ok()">确定</el-button>
+				<el-button @click="sa.closeCurrIframe()">取消</el-button>
+			</div>
+		</div>
+		<script>
+			var app = new Vue({
+				components: {
+					"sa-item": httpVueLoader('../../sa-frame/com/sa-item.vue')
+				},
+				el: '.vue-box',
+				data: {
+					id: sa.p('id', 0), // 获取超链接中的id参数(0=添加,非0=修改) 
+					m: {
+						id: '', // 主键
+						itemName: '',
+						price: '400',
+						payType: '',
+						taxRate:6,
+						businessType: '',
+						unit: '元/车',
+						minLength: '4.2',
+						carLength: '20', //车长
+						minWeight: '5',
+						maxWeight: '10', //最大载重
+						status: '1', //转态
+					}, // 实体对象
+					itemTypeList: [],
+					payTypeList: [],
+					businessTypeList: []
+				},
+				methods: {
+					getBusinessTypeList() {
+						sa.ajax('/TbCostomer/getTypeList', function(resp) {
+							let list = resp.data;
+							
+							this.businessTypeList = list
+						}.bind(this))
+					},
+					getPayTypeList() {
+						sa.ajax('/TbFeeStatistics/getFeeType', function(resp) {
+							let list = resp.data;
+							this.payTypeList = list.filter(obj => obj.id !== 4);
+						}.bind(this))
+					},
+					// 提交数据 
+					ok: function() {
+						// 表单校验 
+						let m = this.m;
+						// sa.checkNull(m.id, '请输入 [主键]');
+						sa.checkNull(m.itemName, '请输入 [项目名称]');
+						sa.checkNull(m.price, '请输入 [计费金额]');
+						sa.checkNull(m.unit, '请输入 [计价单位]');
+						let minLength = m.minLength;
+						let maxLength = m.carLength;
+						let minWeight = m.minWeight;
+						let maxWeight = m.maxWeight;
+						sa.checkNull(minLength, '请输入 [最小车长]');
+						sa.checkNull(maxLength, '请输入 [最大车长]');
+						sa.checkNull(minWeight, '请输入 [最小载重]');
+						sa.checkNull(maxWeight, '请输入 [最大载重]');
+						if (minLength > maxLength) {
+							sa.error('最小车长不能大于最大车长')
+							return;
+						}
+						if (minWeight > maxWeight) {
+							sa.error('最小载重不能大于最大载重')
+							return;
+						}
+						let payTypeList = this.payTypeList;
+						let payType = payTypeList.filter(obj => obj.id == m.payType).pop();
+						m.payType = payType.id;
+						m.payTypeName = payType.name;
+						let businessTypeList = this.businessTypeList;
+						let businessType = businessTypeList.filter(obj => obj.id == m.businessType).pop();
+						m.businessType = businessType.id;
+						m.businessTypeName = businessType.name;
+						// 开始增加或修改
+						sa.ajax('/TbItem/update', m, function(res) {
+							sa.alert('修改成功', this.clean);
+						}.bind(this));
+					},
+					// 添加/修改 完成后的动作
+					clean: function() {
+						if (this.id == 0) {} else {
+							parent.app.f5(); // 刷新父页面列表
+							sa.closeCurrIframe(); // 关闭本页 
+						}
+					},
+				},
+				mounted: function() {
+					sa.ajax('/TbItem/getById?id=' + this.id, function(res) {
+						this.m = res.data;
+					}.bind(this))
+					this.getBusinessTypeList();
+					this.getPayTypeList();
+				}
+			})
+		</script>
+	</body>
+</html>

+ 5 - 2
sp-admin/sa-view/tb-item-type/tb-item-list.html

@@ -33,8 +33,11 @@
 					<el-table-column type="index" width="50">
 					</el-table-column>
 					<sa-td name="明细名称" prop="itemName" width="300px"></sa-td>
+					<sa-td name="业务类型" prop="businessTypeName" ></sa-td>
+					<sa-td name="收费类型" prop="payTypeName"></sa-td>
 					<sa-td name="价格" prop="price"></sa-td>
 					<sa-td name="计价单位" prop="unit"></sa-td>
+						<sa-td name="税率(%)" prop="taxRate"></sa-td>
 					<sa-td name="适合规格(米)">
 						<template slot-scope="s">
 							<label>{{s.row.minLength}}—{{s.row.carLength}}</label>
@@ -102,11 +105,11 @@
 				methods: {
 					// 修改
 					update: function(data) {
-						sa.showIframe('修改数据', 'tb-item-add.html?id=' + data.id, '600px', '60%');
+						sa.showIframe('修改数据', 'tb-item-edit.html?id=' + data.id, '600px', '60%');
 					},
 					// 新增
 					add: function(data) {
-						sa.showIframe('新增数据', 'tb-item-add.html?id=-1', '600px', '60%');
+						sa.showIframe('新增数据', 'tb-item-add.html?id=-1', '600px', '70%');
 					},
 					get(data){
 						sa.showIframe('数据详情', 'tb-item-info.html?id=' + data.id, '600px', '60%');

+ 0 - 18
sp-admin/sa-view/tb-item-type/tb-item-type-add.html

@@ -40,18 +40,6 @@
 						<sa-item type="text" name="项目名称" v-model="m.name" placeholder="请输入项目名称" br>
 						</sa-item>
 						<div class="c-item">
-							<label class="c-label">项目类型:</label>
-							<el-select multiple v-model="businessType"  placeholder="请选择项目类型">
-								<el-option v-for="type in typeList" :key="type.id" :label="type.name" :value="type.id">
-								</el-option>
-							</el-select>
-						</div>
-						<div class="c-item">
-							<label class="c-label">税率(%):</label>
-							<el-input-number class="item-num" v-model="m.taxRate" :step="0.1" :min="0" :max="100"
-								></el-input-number>
-						</div>
-						<div class="c-item">
 							<label class="c-label">排序:</label>
 							<el-input-number class="item-num" v-model="m.sort" :step="1" :min="1" step-strictly>
 							</el-input-number>
@@ -113,14 +101,8 @@
 							sa.closeCurrIframe(); // 关闭本页 
 						}
 					},
-					getTypeList() {
-						sa.ajax('/TbCostomer/getTypeList', function(resp) {
-							this.typeList = resp.data;
-						}.bind(this))
-					}
 				},
 				mounted: function() {
-					this.getTypeList();
 					// 初始化数据 
 					if (this.id <= 0) {} else {
 						sa.ajax('/TbItemType/getById?id=' + this.id, function(res) {

+ 1 - 3
sp-admin/sa-view/tb-item-type/tb-item-type-list.html

@@ -31,9 +31,7 @@
 				<!-- ------------- 数据列表 ------------- -->
 				<el-table class="data-table" ref="data-table" :data="dataList">
 					<el-table-column type="index" width="50"></el-table-column>
-					<sa-td name="项目名称" prop="name" width="200px"></sa-td>
-					
-					<sa-td name="税率" prop="taxRate"></sa-td>
+					<sa-td name="项目名称" prop="name" ></sa-td>
 					<sa-td name="排序" prop="sort"></sa-td>
 					<el-table-column label="操作" fixed="right" width="260px">
 						<template slot-scope="s">

+ 2 - 1
sp-admin/sa-view/tb-item-type/tb-item.html

@@ -32,6 +32,7 @@
 					<sa-td name="明细名称" prop="itemName"></sa-td>
 					<sa-td name="价格" prop="price"></sa-td>
 					<sa-td name="单位" prop="unit"></sa-td>
+					<sa-td name="税率" prop="taxRate"></sa-td>
 					<sa-td name="适合规格(米)">
 						<template slot-scope="s">
 							<label>{{s.row.minLength}}—{{s.row.carLength}}</label>
@@ -42,7 +43,7 @@
 							<label>{{s.row.minWeight}}—{{s.row.maxWeight}}</label>
 						</template>
 					</sa-td>
-					
+
 					<sa-td name="明细数量" prop="inc" type="switch" :jv="{1: '多个[#005500]', 0: '单个[#ff0000]'}"
 						@change="s => updateNum(s.row)"></sa-td>
 					<sa-td name="是否必须" prop="need" type="switch" :jv="{1: '是[#005500]', 0: '否[#ff0000]'}"

+ 1 - 1
sp-server/app.pid

@@ -1 +1 @@
-28208
+22156

+ 2 - 2
sp-server/src/main/java/com/pj/api/service/ApiService.java

@@ -297,10 +297,10 @@ public class ApiService {
             TbBusinessItem item = new TbBusinessItem();
             int num = tbItem.getNum();
             BigDecimal itemTotalPrice = tbItem.getPrice().multiply(new BigDecimal(num));
-            item.setNo(no + "0" + index)
+            item.setNo(no + "0" + index).setPayTypeName(tbItem.getPayTypeName()).setPayType(tbItem.getPayType())
+                    .setBusinessType(tbItem.getBusinessType()).setTaxRate(NumberUtil.div(tbItem.getTaxRate().doubleValue(),100D,2))
                     .setBusinessType(TbCostomer.CustomerEnum.DISINFECT_TYPE.getType());
             item.setItemCode(tbItem.getItemCode()).setNum("1").setNum(num + "").setItemId(tbItem.getId()).setItemCode(tbItem.getItemCode())
-                    .setItemTypeName(tbItem.getTypeName())
                     .setItemName(tbItem.getItemName()).setItemPrice(tbItem.getPrice()).setRemark(tbItem.getRemark())
                     .setItemTypeId(tbItem.getTypeId()).setItemTypeName(tbItem.getTypeName())
                     .setUnit(tbItem.getUnit()).setTotal(itemTotalPrice).setCreateTime(new Date());

+ 5 - 4
sp-server/src/main/java/com/pj/project/tb_business/TbBusinessService.java

@@ -196,8 +196,10 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             String typeId = tbItem.getTypeId();
             price = price.add(NumberUtil.mul(num, tbItem.getPrice()));
             TbItemType tbItemType = tbItemTypeService.getById(typeId);
-            item.setBusinessId(t.getId()).setItemCode(tbItem.getItemCode())
+            item.setBusinessId(t.getId()).setItemCode(tbItem.getItemCode()).setBusinessType(tbItem.getBusinessType())
+                    .setPayType(tbItem.getPayType()).setPayTypeName(tbItem.getPayTypeName())
                     .setItemName(tbItem.getItemName()).setItemPrice(tbItem.getPrice())
+                    .setTaxRate(NumberUtil.div(tbItem.getTaxRate().doubleValue(),100D,2))
                     .setItemTypeId(typeId).setItemTypeName(tbItemType.getName()).setBusinessType(tbItemType.getBusinessType())
                     .setUnit(tbItem.getUnit()).setTotal(NumberUtil.mul(num, tbItem.getPrice())).setCreateTime(new Date())
                     .setNo(t.getNo() + "0" + index);
@@ -344,14 +346,13 @@ public class TbBusinessService extends ServiceImpl<TbBusinessMapper, TbBusiness>
             storeMsg(business.getCustomerId(), "业务订单【" + business.getNo() + "】已确认" + DateUtil.now() + "。");
             List<TbBusinessItem> items = tbBusinessItemService.findByBusinessId(id);
             items.forEach(item -> {
-                TbItemType tbItemType = tbItemTypeService.getById(item.getItemTypeId());
-                String businessType = tbItemType.getBusinessType();
+                String businessType = item.getBusinessType();
                 if (!StrUtil.equals(businessType, TbCostomer.CustomerEnum.BUSINESS_TYPE.getType())) {
                     String remark = "车牌:" + business.getCardNo();
                     if (StrUtil.isNotEmpty(business.getChinaCarNo())) {
                         remark += "、" + business.getChinaCarNo();
                     }
-                    MsgDataBO msgDataBO = new MsgDataBO("订单号:" + item.getNo(), tbItemType.getName(), item.getItemName(), business.getGoodsName(), DateUtil.now(), remark);
+                    MsgDataBO msgDataBO = new MsgDataBO("订单号:" + item.getNo(), item.getItemTypeName(), item.getItemName(), business.getGoodsName(), DateUtil.now(), remark);
                     StrUtil.splitTrim(businessType, ",").forEach(type -> {
                         List<String> openidList = tbCostomerService.findByBusinessTypeOpenid(type);
                         openidList.forEach(openid -> {

+ 4 - 0
sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItem.java

@@ -108,6 +108,10 @@ public class TbBusinessItem extends Model<TbBusinessItem> implements Serializabl
 	 */
 	private Integer payType;
 	private String payTypeName;
+	/**
+	 * 税率
+	 */
+	private Double taxRate;
 
 	@TableField(exist = false)
 	private String goodsName;

+ 3 - 0
sp-server/src/main/java/com/pj/project/tb_item/TbItem.java

@@ -68,10 +68,13 @@ public class TbItem extends Model<TbItem> implements Serializable {
      * 业务分类
      */
     private String businessType;
+    private String businessTypeName;
     /**
      * 收费分类
      */
     private Integer payType;
+    private String payTypeName;
+    private Double taxRate;
     @TableField(exist = false)
     private String remark;
 

+ 1 - 1
sp-server/src/main/java/com/pj/project/tb_item/TbItemMapper.xml

@@ -60,7 +60,7 @@
             a.min_weight,
             a.max_weight,
             b.need,b.type_id,b.need_remark,b.must_remark,
-            a.unit,b.inc
+            a.unit,b.inc,a.business_type,a.business_type_name,a.pay_type,a.pay_type_name,a.tax_rate
         FROM
             tb_item a,
             relation_type_item b