Git Product home page Git Product logo

backend-next's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

backend-next's Issues

Anomaly Detection & Column-based Drop Matrix Elements

To detect anomaly and also produce more fancy ways of visualizing the data (including having a top source panel for providers to see the rate of their provider usage, etc) here's a proposed method that uses X-dimension tuple to describe all attributes of the drop report data:

  • There are two types of column.
  • The first column type is a set of identifiers, e.g. item_id, stage_id, range_id, server, account_id, source_name, source_version, ip_address. Those identifiers could be used as GROUP BY keys to aggregate drop matrix data in various forms of filtering.
  • The second column type is simply values in which are not meant to be GROUP on, e.g. times, quantity, standard_deviation.

This could help in various ways, including improving performance of advanced query, enabling much easier forms of visualizing the dataset, and centralizing & pre-aggregating potential wanted filtering on various conditions.

Furthermore, periodically check this table with different sets of GROUP aggregations can let us find and detect anomaly way easier than before, and is also a more advanced way comparing to full-table aggregations. Also, this could even potentially be the fallback data source of StatHouse in where it delivers real-time dataset changes to users. By dedicating such usage cases and combine them into this table we can unlock much more potentials to deliver more trusty statistics and can also start to deliver insightful data breakdowns fairly easily starting from here.

Failed to report gachabox stage drop

backend_1  | 2022-03-09T22:00:33.097330775Z ERR panic: reflect: Call using *types.Drop as type types.ArkDrop
backend_1  | goroutine 6389880 [running]:
backend_1  | github.com/penguin-statistics/backend-next/internal/server/httpserver.Create.func2(0xde4000, {0xdf22e0, 0xc004df9ce0})
backend_1  | 	/app/internal/server/httpserver/http.go:92 +0x50
backend_1  | github.com/gofiber/fiber/v2/middleware/recover.New.func1.1()
backend_1  | 	/go/pkg/mod/github.com/gofiber/fiber/[email protected]/middleware/recover/recover.go:33 +0x7a
backend_1  | panic({0xdf22e0, 0xc004df9ce0})
backend_1  | 	/usr/local/go/src/runtime/panic.go:1038 +0x215
backend_1  | reflect.Value.call({0xe05720, 0xfaae58, 0x7f2ccb9745b8}, {0xf4714f, 0x4}, {0xc004387b48, 0x1, 0x10000c004e01380})
backend_1  | 	/usr/local/go/src/reflect/value.go:411 +0x19ff
backend_1  | reflect.Value.Call({0xe05720, 0xfaae58, 0xc00463e150}, {0xc004387b48, 0x1, 0x1})
backend_1  | 	/usr/local/go/src/reflect/value.go:339 +0xc5
backend_1  | github.com/ahmetb/go-linq/v3.(*genericFunc).Call(0xc000131460, {0xc0050f0c18, 0x1, 0xd})
backend_1  | 	/go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/genericfunc.go:35 +0x70
backend_1  | github.com/ahmetb/go-linq/v3.Query.SelectT.func1({0xdd0040, 0xc002b337c0})
backend_1  | 	/go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/select.go:47 +0x47
backend_1  | github.com/ahmetb/go-linq/v3.Query.Select.func1.1()
backend_1  | 	/go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/select.go:24 +0x3e
backend_1  | github.com/ahmetb/go-linq/v3.Query.SumInts({0xddb940})
backend_1  | 	/go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/result.go:477 +0x2f
backend_1  | github.com/penguin-statistics/backend-next/internal/utils/reportutils.AggregateGachaBoxDrops(0xc002ccac00)
backend_1  | 	/app/internal/utils/reportutils/merge_drops.go:34 +0x54
backend_1  | github.com/penguin-statistics/backend-next/internal/service.(*ReportService).PreprocessAndQueueSingularReport(0xc0004dd260, 0xc002a9d340, 0xc00463e0e0)
backend_1  | 	/app/internal/service/report.go:180 +0x174
backend_1  | github.com/penguin-statistics/backend-next/internal/controllers/shims.(*ReportController).SingularReport(0xc0003d7d40, 0xc00184c840)
backend_1  | 	/app/internal/controllers/shims/report.go:48 +0x65

Improve GitHub Community Experience

We should provide GitHub Issue Templates to help new contributors to fill the required information when creating an issue.

Also we could open up the discussions tab, if that is needed.

Unify the form of nouns in packages names

This project uses different forms of noun. e.g., controllers and utils are plural, but service is singular. I suggest renaming them all into singular form, because Golang standard library uses singular noun as its package names (e.g.: encoding/... instead of encodings/...).

You can find more discussions at:

Also, I suggest following the naming guidelines here and here. Meaning that generic packages such as utils should be broken up. However I understand it's a hard work to re-organize the code, especially that this project is migrated from an existing Java backend. How do you think?

Infrastructure: Migrate to Kubernetes

Kubernetes provides a great orchestration for relatively fractured services, just like what Penguin Stats is currently in. We've got a huge wide range of services to monitor status with, and to scale some of them when needed, e.g. Planner when there's a high demand on farm planning.

We have implemented several stages to move forward to K8S, and eventually running all of our services on it, providing a more structured and organized orchestration on our services.

Ignore items that are not presenting in DB rather than throwing an error

This is to consider that third party tools might not and nor we should expect to, have a consistent record of all items not presenting in Penguin Statistics DB but is presenting in the data file of Arknights. Such items shall be simply stripped away and the original, "recognizable" items shall be kept.

Transparency Log of Report Invalidations

Due to various external or internal reasons, sometimes we need to do report invalidations or changes based on the issue lays on the dataset, for a more easy-to-interpret dataset there has. However, those changes are currently not transparent to the external users and even sometimes causing problems for ourselves to keep track of exact records in which have been edited. Therefore there's a proposed transparency log of changes made to the dataset, in an effort of keeping the track and to the community.

The log consists of several features:

  • A dashboard of on-going continuous automated invalidations. Currently, if the report is not meeting with the DropInfo defined in a specific stage, the report will be automatically flagged as non-reliable, effectively invalidating the record. Other than that, there's no other on-going continuous invalidations.
  • A list of instantaneous invalidations. Those typically consists of service abusing from a particular IP address or Account, as a huge number of their reports are statistically extremely unlikely to happen, in which we consider an abuse to the service and will flag those IP/Accounts manually. Such cases are currently relatively unlikely to happen, but we do have to intervene several times before to avoid huge deviation on the dataset.
  • A dataset snapshots of before & after invalidations are generated. This could be somewhat trivial to implement and its importance might not be so apparent. Open to discussion on this idea.

Data Inconsistency & Unexpected Structure Monitoring

The latest activity in CN, opened last day (2022-05-01 16PM GMT+8) have empty DropInfos served on API for a whole 5 hours until a member @FlandiaYingman found such issue and informed us last night (2022-05-01 21PM GMT+8) and fixed in several minutes by manually purging the server-side cache. This has caused reports only starting from after 21PM GMT+8 and have caused some of the reports being flagged due to DropInfo mismatch.

In the future we should've been able to mitigate this by properly purging the cache after an update via Admin API have been performed (#58), but also we could add an additional end-to-end check via the real API on the soracli, so that consistency of API response is guaranteed. Further, this logic could've been abstracted and added to the server side too, creating autonomous monitoring tasks to continuously guard the service from serving dirty caches anymore in the future.

K8s Migration: Final Cleanup

  • Shutdown obsolete AWS services
    • EC2 resources
    • ELB resources
    • EBS resources
  • DNS & other "pointer"-alike index cleanup

The Adoption of T-test Instead of Z-test Might Improve the Accuracy

We cannot know the real σ (Standard Deviation), because the standard deviation we get is from the data we get from users. Then we have to consider df (Degree of Freedom) to the test for σ-hat. T-test could make the result more accurate because it make df into consideration while z-test only exist when df tends to infinity or σ is ideally known.
Thus, the adoption of T-test is better then Z-test.

Rate-limit Advanced Query

To avoid DDoS vulnerability advanced query shall be rate limited. General usage shall be far from triggering limitation.

This limit could be placed either on nginx or on the application side, while personally I prefer to just place it on the application side as more complex logic could be added with ease, while still maintaining a pretty low latency due to we are short-circuiting the request if it triggered the rate limit mechanism (of course).

Incorrect `Vary` header resulting in Cache pollusion

Vary header currently errornously only contains Accept-Encoding but it should also contain Origin for correct CORS header generation. This could break third party apps and even our own frontend if not mitigated.

K8s Migration: Migrate Services to K8s

Services to migrate

  • backend-next: Website Next Backend
  • frontend-v2: Website v2 Frontend
  • widget-backend: Widget Backend
    • widget-docs: Widget Docs
    • widget-frontend: Widget Frontend
  • planner: Planner Backend
  • probe: Probe Service
    • prometheus: Prometheus DB
    • grafana: Grafana Dashboard

K8s Migration: Containerize Services

Services to containerize

  • backend-next: Website Next Backend
  • frontend-v2: Website v2 Frontend
  • widget-backend: Widget Backend
    • widget-docs: Widget Docs
    • widget-frontend: Widget Frontend
  • planner: Planner Backend
  • probe: Probe Service
    • prometheus: Prometheus DB
    • grafana: Grafana Dashboard

Shorten Cache TTL

Currently the overall Cache TTL on average, existing on the backend is too long. As the architectural performance now could easily handle queries like those, we could and should shorten cache TTLs to about 15~60 minutes on a majority of them to mitigate potential dirty cache issues occurred in #62.

K8s Migration: Move out from AWS

Move services out of the obsolete AWS EC2.

Nodes

  • penguin-production: Serves as the main server. Containing the PS website frontend, website backend, planner frontend, planner backend, and the v1 frontend.
  • penguin-meta: Monitors server status and act as a server containing side-services. Containing the probe service, grafana, prometheus.

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Rate-Limited

These updates are currently rate-limited. Click on a checkbox below to force their creation now.

  • fix(deps): update module github.com/felixge/fgprof to v0.9.4
  • fix(deps): update module github.com/swaggo/swag to v1.16.3
  • chore(deps): update golang docker tag to v1.22.2
  • fix(deps): update aws-sdk-go-v2 monorepo (github.com/aws/aws-sdk-go-v2, github.com/aws/aws-sdk-go-v2/config, github.com/aws/aws-sdk-go-v2/credentials, github.com/aws/aws-sdk-go-v2/service/s3)
  • fix(deps): update module github.com/antonmedv/expr to v1.16.5
  • fix(deps): update module github.com/avast/retry-go/v4 to v4.5.1
  • fix(deps): update module github.com/aws/smithy-go to v1.20.2
  • fix(deps): update module github.com/getsentry/sentry-go to v0.27.0
  • fix(deps): update module github.com/go-playground/validator/v10 to v10.19.0
  • fix(deps): update module github.com/go-redsync/redsync/v4 to v4.13.0
  • fix(deps): update module github.com/jinzhu/copier to v0.4.0
  • fix(deps): update module github.com/prometheus/client_golang to v1.19.0
  • fix(deps): update module github.com/redis/go-redis/v9 to v9.5.1
  • fix(deps): update module github.com/rs/zerolog to v1.32.0
  • fix(deps): update module github.com/samber/lo to v1.39.0
  • fix(deps): update module github.com/stretchr/testify to v1.9.0
  • fix(deps): update module github.com/tidwall/gjson to v1.17.1
  • fix(deps): update module github.com/uptrace/bun/extra/bunotel to v1.2.1
  • fix(deps): update module github.com/urfave/cli/v2 to v2.27.1
  • fix(deps): update module github.com/valyala/fasthttp to v1.52.0
  • fix(deps): update module github.com/vmihailenco/msgpack/v5 to v5.4.1
  • fix(deps): update module go.uber.org/fx to v1.21.0
  • fix(deps): update module golang.org/x/mod to v0.17.0
  • fix(deps): update module golang.org/x/sync to v0.7.0
  • fix(deps): update module gopkg.in/datadog/dd-trace-go.v1 to v1.62.0
  • fix(deps): update opentelemetry-go monorepo (go.opentelemetry.io/otel, go.opentelemetry.io/otel/exporters/jaeger, go.opentelemetry.io/otel/exporters/otlp/otlptrace, go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc, go.opentelemetry.io/otel/exporters/stdout/stdouttrace, go.opentelemetry.io/otel/sdk, go.opentelemetry.io/otel/trace)
  • chore(deps): update actions/cache action to v4
  • chore(deps): update actions/checkout action to v4
  • chore(deps): update actions/github-script action to v7
  • chore(deps): update github/codeql-action action to v3
  • fix(deps): update module github.com/gofiber/contrib/otelfiber to v2
  • fix(deps): update module github.com/gofiber/swagger to v1
  • fix(deps): update module gopkg.in/guregu/null.v3 to v5
  • 🔐 Create all rate-limited PRs at once 🔐

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

dockerfile
Dockerfile
  • golang 1.21.6-alpine
github-actions
.github/workflows/build-check.yml
  • actions/checkout v3
.github/workflows/build-release.yml
  • actions/checkout v3
.github/workflows/codeql.yml
  • actions/checkout v3
  • actions/cache v3
  • github/codeql-action v2
  • github/codeql-action v2
.github/workflows/pr-auto-upsert.yml
  • actions/checkout v3
  • actions/github-script v6
.github/workflows/release-dispatcher.yml
  • actions/checkout v3
  • actions/github-script v6
gomod
go.mod
  • go 1.19
  • exusiai.dev/gommon v0.0.9
  • github.com/ahmetb/go-linq/v3 v3.2.0
  • github.com/ansrivas/fiberprometheus/v2 v2.6.1
  • github.com/antonmedv/expr v1.12.7
  • github.com/avast/retry-go/v4 v4.3.4
  • github.com/aws/aws-sdk-go-v2 v1.23.5
  • github.com/aws/aws-sdk-go-v2/config v1.25.11
  • github.com/aws/aws-sdk-go-v2/credentials v1.16.9
  • github.com/aws/aws-sdk-go-v2/service/s3 v1.47.2
  • github.com/aws/smithy-go v1.18.1
  • github.com/davecgh/go-spew v1.1.1
  • github.com/dchest/uniuri v1.2.0
  • github.com/felixge/fgprof v0.9.3
  • github.com/gabstv/go-bsdiff v1.0.5
  • github.com/getsentry/sentry-go v0.22.0
  • github.com/go-playground/locales v0.14.1
  • github.com/go-playground/universal-translator v0.18.1
  • github.com/go-playground/validator/v10 v10.16.0
  • github.com/go-redsync/redsync/v4 v4.9.4
  • github.com/goccy/go-json v0.10.2
  • github.com/gofiber/contrib/fibersentry v1.0.4
  • github.com/gofiber/contrib/otelfiber v1.0.10
  • github.com/gofiber/fiber/v2 v2.50.0
  • github.com/gofiber/helmet/v2 v2.2.26
  • github.com/gofiber/swagger v0.1.14
  • github.com/jinzhu/copier v0.3.5
  • github.com/joho/godotenv v1.5.1
  • github.com/kelseyhightower/envconfig v1.4.0
  • github.com/nats-io/nats.go v1.24.0
  • github.com/oklog/ulid/v2 v2.1.0
  • github.com/oschwald/geoip2-golang v1.9.0
  • github.com/pkg/errors v0.9.1
  • github.com/prometheus/client_golang v1.16.0
  • github.com/redis/go-redis/v9 v9.0.5
  • github.com/rs/xid v1.5.0
  • github.com/rs/zerolog v1.31.0
  • github.com/samber/lo v1.38.1
  • github.com/stretchr/testify v1.8.4
  • github.com/swaggo/swag v1.16.2
  • github.com/tidwall/gjson v1.16.0
  • github.com/tidwall/sjson v1.2.5
  • github.com/uptrace/bun v1.1.14
  • github.com/uptrace/bun/dialect/pgdialect v1.1.14
  • github.com/uptrace/bun/driver/pgdriver v1.1.14
  • github.com/uptrace/bun/extra/bundebug v1.1.14
  • github.com/uptrace/bun/extra/bunotel v1.1.14
  • github.com/urfave/cli/v2 v2.25.7
  • github.com/vmihailenco/msgpack/v5 v5.3.5
  • github.com/zeebo/xxh3 v1.0.2
  • go.opentelemetry.io/otel v1.16.0
  • go.opentelemetry.io/otel/exporters/jaeger v1.16.0
  • go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0
  • go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0
  • go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0
  • go.opentelemetry.io/otel/sdk v1.16.0
  • go.uber.org/fx v1.19.2
  • golang.org/x/mod v0.14.0
  • golang.org/x/sync v0.5.0
  • golang.org/x/text v0.14.0
  • google.golang.org/protobuf v1.30.0
  • gopkg.in/DataDog/dd-trace-go.v1 v1.48.0
  • gopkg.in/guregu/null.v3 v3.5.0
  • gopkg.in/natefinch/lumberjack.v2 v2.2.1
  • github.com/patrickmn/go-cache v2.1.0+incompatible
  • github.com/valyala/fasthttp v1.50.0
  • go.opentelemetry.io/otel/trace v1.16.0

  • Check this box to trigger a request for Renovate to run again on this repository

Arkplanner returns with only "Operation Barrenland Supplies"

This happens on US, JP, and KR servers, but not on CN.

These items cannot be disabled in excludes or options either.
image

Planner also shows some synthesis that doesn't make any sense, as I have more than needed, and it's not used in other synthesis either.
For example: Bipolar Nanoflakes (have: 4, required: 0)
image

The export of the request I'm trying to send:

{"@type":"@penguin-statistics/planner/config","items":[{"id":"30135","have":1,"need":4},{"id":"30125","have":4},{"id":"30115","have":1,"need":4},{"id":"30074","have":27},{"id":"30073","have":130},{"id":"30084","have":10,"need":4},{"id":"30083","have":2,"need":3},{"id":"30093","have":24},{"id":"30104","need":2},{"id":"30103","have":84},{"id":"30013","need":6},{"id":"30012","have":62},{"id":"30011","have":20},{"id":"30064","have":6,"need":5},{"id":"30063","have":2},{"id":"30062","have":46},{"id":"30061","have":33},{"id":"30034","have":5},{"id":"30033","have":53},{"id":"30032","have":113},{"id":"30031","have":104},{"id":"30024","have":4},{"id":"30023","have":6},{"id":"30022","have":114},{"id":"30021","have":83},{"id":"30044","have":19,"need":8},{"id":"30043","have":17},{"id":"30042","have":69},{"id":"30041","have":16},{"id":"30054","have":3},{"id":"30053","have":10},{"id":"30052","have":42},{"id":"30051","have":29},{"id":"31014","need":3},{"id":"31013","have":10},{"id":"31024","have":20,"need":5},{"id":"31023","have":5},{"id":"30145","have":2},{"id":"31034","have":3},{"id":"31033","have":31},{"id":"31044","have":16},{"id":"31043","have":37},{"id":"31054","have":19},{"id":"31053","have":24}],"options":{"byProduct":false,"requireExp":false,"requireLmb":false},"excludes":[]}

Request that gets sent:

{"required":{"30013":6,"30044":8,"30064":5,"30083":3,"30084":4,"30104":2,"30115":4,"30135":4,"31014":3,"31024":5},"owned":{"30011":20,"30012":62,"30021":83,"30022":114,"30023":6,"30024":4,"30031":104,"30032":113,"30033":53,"30034":5,"30041":16,"30042":69,"30043":17,"30044":19,"30051":29,"30052":42,"30053":10,"30054":3,"30061":33,"30062":46,"30063":2,"30064":6,"30073":130,"30074":27,"30083":2,"30084":10,"30093":24,"30103":84,"30115":1,"30125":4,"30135":1,"30145":2,"31013":10,"31023":5,"31024":20,"31033":31,"31034":3,"31043":37,"31044":16,"31053":24,"31054":19},"extra_outc":false,"exp_demand":false,"gold_demand":false,"input_lang":"id","output_lang":"id","server":"US"}

Server response:

{"cost":11342,"gcost":79133,"gold":136114,"exp":0,"stages":[{"stageId":"randomMaterialRune_0","stage":"randomMaterialRune_0","count":"115","items":{"30013":"14","30063":"8","30033":"9","30023":"9","30043":"9","30053":"8","30073":"12","30083":"9","30093":"8","30103":"8","31013":"8","31023":"11"}}],"syntheses":[{"target":"30135","count":"3","materials":{"30084":"3.0","30094":"3.0","30104":"3.0"}},{"target":"30125","count":"1","materials":{"30064":"0.7","30074":"1.3"}},{"target":"30115","count":"3","materials":{"30014":"3.0","30044":"3.0","30054":"3.0"}},{"target":"30104","count":"5","materials":{"30103":"5.0","30013":"10.0","30053":"5.0"}},{"target":"30094","count":"17","materials":{"30093":"16.5","30043":"16.5","30063":"16.5"}},{"target":"30084","count":"3","materials":{"30083":"5.3","30033":"2.6","30073":"2.6"}},{"target":"30074","count":"46","materials":{"30073":"45.6","30023":"45.6","30103":"45.6"}},{"target":"30062","count":"10","materials":{"30061":"29.4"}},{"target":"30063","count":"14","materials":{"30062":"53.0"}},{"target":"30052","count":"9","materials":{"30051":"25.5"}},{"target":"30053","count":"12","materials":{"30052":"47.7"}},{"target":"30054","count":"1","materials":{"30053":"1.8","30023":"0.9","30083":"0.9"}},{"target":"30042","count":"5","materials":{"30041":"12.3"}},{"target":"30043","count":"17","materials":{"30042":"68.2"}},{"target":"30044","count":"5","materials":{"30043":"8.9","30063":"4.5","30033":"4.5"}},{"target":"30032","count":"33","materials":{"30031":"97.4"}},{"target":"30033","count":"35","materials":{"30032":"138.2"}},{"target":"30034","count":"23","materials":{"30033":"44.8","30053":"22.4","30073":"22.4"}},{"target":"30022","count":"26","materials":{"30021":"78.3"}},{"target":"30023","count":"34","materials":{"30022":"136.4"}},{"target":"30024","count":"1","materials":{"30023":"1.1","30043":"0.6","30083":"0.6"}},{"target":"30012","count":"7","materials":{"30011":"20.0"}},{"target":"30013","count":"14","materials":{"30012":"68.7"}},{"target":"30014","count":"3","materials":{"30013":"12.0"}},{"target":"31024","count":"1","materials":{"30063":"1.0","30093":"1.0","31023":"1.0"}},{"target":"31014","count":"12","materials":{"30043":"11.3","31013":"11.3","31023":"11.3"}},{"target":"30145","count":"4","materials":{"31034":"3.4","31014":"6.8","31024":"3.4"}},{"target":"31034","count":"3","materials":{"31033":"4.8","31013":"2.4","31023":"2.4"}},{"target":"31044","count":"3","materials":{"31043":"2.2","31053":"2.2","31013":"2.2"}},{"target":"31054","count":"21","materials":{"31053":"20.2","31033":"20.2","30103":"20.2"}}],"values":[{"level":"5","items":[{"name":"30115","value":"3180.25"},{"name":"30135","value":"1590.12"},{"name":"30155","value":"379.88"},{"name":"30125","value":"0.00000"},{"name":"30145","value":"0.00000"}]},{"level":"4","items":[{"name":"30014","value":"3180.25"},{"name":"30104","value":"1590.12"},{"name":"31064","value":"379.88"},{"name":"30064","value":"0.00001"},{"name":"30034","value":"0.00000"},{"name":"30024","value":"0.00000"},{"name":"30044","value":"0.00000"},{"name":"30054","value":"0.00000"},{"name":"30074","value":"0.00000"},{"name":"30084","value":"0.00000"},{"name":"30094","value":"0.00000"},{"name":"31014","value":"0.00000"},{"name":"31024","value":"0.00000"},{"name":"31034","value":"0.00000"},{"name":"31044","value":"0.00000"},{"name":"31054","value":"0.00000"}]},{"level":"3","items":[{"name":"30013","value":"795.06"},{"name":"31063","value":"379.88"},{"name":"30063","value":"0.00000"},{"name":"30033","value":"0.00000"},{"name":"30023","value":"0.00000"},{"name":"30043","value":"0.00000"},{"name":"30053","value":"0.00000"},{"name":"30073","value":"0.00000"},{"name":"30083","value":"0.00000"},{"name":"30093","value":"0.00000"},{"name":"30103","value":"0.00000"},{"name":"31013","value":"0.00000"},{"name":"31023","value":"0.00000"},{"name":"31033","value":"0.00000"},{"name":"31043","value":"0.00000"},{"name":"31053","value":"0.00000"}]},{"level":"2","items":[{"name":"30012","value":"159.01"},{"name":"30062","value":"0.00000"},{"name":"30032","value":"0.00000"},{"name":"30022","value":"0.00000"},{"name":"30042","value":"0.00000"},{"name":"30052","value":"0.00000"}]},{"level":"1","items":[{"name":"30011","value":"53.00"},{"name":"30061","value":"0.00000"},{"name":"30031","value":"0.00000"},{"name":"30021","value":"0.00000"},{"name":"30041","value":"0.00000"},{"name":"30051","value":"0.00000"}]}]}

Update item formulas (`/api/v2/formula`)

Just do: UPDATE properties SET value = ? WHERE key = 'formula', where ? is the following:

[{"id":"3131","name":"基础加固建材","goldCost":800,"costs":[{"id":"3112","name":"碳","rarity":1,"count":2}],"extraOutcome":[{"id":"3112","name":"碳","rarity":1,"count":1,"weight":100}],"totalWeight":100},{"id":"3132","name":"进阶加固建材","goldCost":2400,"costs":[{"id":"3113","name":"碳素","rarity":2,"count":2}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3133","name":"高级加固建材","goldCost":7200,"costs":[{"id":"3114","name":"碳素组","rarity":3,"count":2}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3113","name":"碳素","goldCost":0,"costs":[{"id":"3112","name":"碳","rarity":1,"count":3}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3114","name":"碳素组","goldCost":0,"costs":[{"id":"3113","name":"碳素","rarity":2,"count":3}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":200,"costs":[{"id":"3112","name":"碳","rarity":1,"count":1}],"extraOutcome":[{"id":"3112","name":"碳","rarity":1,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":200,"costs":[{"id":"3113","name":"碳素","rarity":2,"count":1}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":200,"costs":[{"id":"3114","name":"碳素组","rarity":3,"count":1}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":0,"costs":[{"id":"3131","name":"基础加固建材","rarity":1,"count":1}],"extraOutcome":[{"id":"3112","name":"碳","rarity":1,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":0,"costs":[{"id":"3132","name":"进阶加固建材","rarity":2,"count":1}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":0,"costs":[{"id":"3133","name":"高级加固建材","rarity":3,"count":1}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"30135","name":"D32钢","goldCost":400,"costs":[{"id":"30084","name":"三水锰矿","rarity":3,"count":1},{"id":"30094","name":"五水研磨石","rarity":3,"count":1},{"id":"30104","name":"RMA70-24","rarity":3,"count":1}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"30125","name":"双极纳米片","goldCost":400,"costs":[{"id":"30064","name":"改量装置","rarity":3,"count":1},{"id":"30074","name":"白马醇","rarity":3,"count":2}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"30115","name":"聚合剂","goldCost":400,"costs":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1},{"id":"30044","name":"异铁块","rarity":3,"count":1},{"id":"30054","name":"酮阵列","rarity":3,"count":1}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"30104","name":"RMA70-24","goldCost":300,"costs":[{"id":"30103","name":"RMA70-12","rarity":2,"count":1},{"id":"30013","name":"固源岩组","rarity":2,"count":2},{"id":"30053","name":"酮凝集组","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30094","name":"五水研磨石","goldCost":300,"costs":[{"id":"30093","name":"研磨石","rarity":2,"count":1},{"id":"30043","name":"异铁组","rarity":2,"count":1},{"id":"30063","name":"全新装置","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30084","name":"三水锰矿","goldCost":300,"costs":[{"id":"30083","name":"轻锰矿","rarity":2,"count":2},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1},{"id":"30073","name":"扭转醇","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30074","name":"白马醇","goldCost":300,"costs":[{"id":"30073","name":"扭转醇","rarity":2,"count":1},{"id":"30023","name":"糖组","rarity":2,"count":1},{"id":"30103","name":"RMA70-12","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30062","name":"装置","goldCost":100,"costs":[{"id":"30061","name":"破损装置","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30063","name":"全新装置","goldCost":200,"costs":[{"id":"30062","name":"装置","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30064","name":"改量装置","goldCost":300,"costs":[{"id":"30063","name":"全新装置","rarity":2,"count":1},{"id":"30013","name":"固源岩组","rarity":2,"count":2},{"id":"30093","name":"研磨石","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30052","name":"酮凝集","goldCost":100,"costs":[{"id":"30051","name":"双酮","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30053","name":"酮凝集组","goldCost":200,"costs":[{"id":"30052","name":"酮凝集","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30054","name":"酮阵列","goldCost":300,"costs":[{"id":"30053","name":"酮凝集组","rarity":2,"count":2},{"id":"30023","name":"糖组","rarity":2,"count":1},{"id":"30083","name":"轻锰矿","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30042","name":"异铁","goldCost":100,"costs":[{"id":"30041","name":"异铁碎片","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30043","name":"异铁组","goldCost":200,"costs":[{"id":"30042","name":"异铁","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30044","name":"异铁块","goldCost":300,"costs":[{"id":"30043","name":"异铁组","rarity":2,"count":2},{"id":"30063","name":"全新装置","rarity":2,"count":1},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30032","name":"聚酸酯","goldCost":100,"costs":[{"id":"30031","name":"酯原料","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30033","name":"聚酸酯组","goldCost":200,"costs":[{"id":"30032","name":"聚酸酯","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30034","name":"聚酸酯块","goldCost":300,"costs":[{"id":"30033","name":"聚酸酯组","rarity":2,"count":2},{"id":"30053","name":"酮凝集组","rarity":2,"count":1},{"id":"30073","name":"扭转醇","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30022","name":"糖","goldCost":100,"costs":[{"id":"30021","name":"代糖","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30023","name":"糖组","goldCost":200,"costs":[{"id":"30022","name":"糖","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30024","name":"糖聚块","goldCost":300,"costs":[{"id":"30023","name":"糖组","rarity":2,"count":2},{"id":"30043","name":"异铁组","rarity":2,"count":1},{"id":"30083","name":"轻锰矿","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30012","name":"固源岩","goldCost":100,"costs":[{"id":"30011","name":"源岩","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30013","name":"固源岩组","goldCost":200,"costs":[{"id":"30012","name":"固源岩","rarity":1,"count":5}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30014","name":"提纯源岩","goldCost":300,"costs":[{"id":"30013","name":"固源岩组","rarity":2,"count":4}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"3302","name":"技巧概要·卷2","goldCost":0,"costs":[{"id":"3301","name":"技巧概要·卷1","rarity":1,"count":3}],"extraOutcome":[{"id":"3302","name":"技巧概要·卷2","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3303","name":"技巧概要·卷3","goldCost":0,"costs":[{"id":"3302","name":"技巧概要·卷2","rarity":2,"count":3}],"extraOutcome":[{"id":"3303","name":"技巧概要·卷3","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3231","name":"重装芯片","goldCost":0,"costs":[{"id":"3261","name":"医疗芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3261","name":"医疗芯片","goldCost":0,"costs":[{"id":"3231","name":"重装芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3241","name":"狙击芯片","goldCost":0,"costs":[{"id":"3251","name":"术师芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3251","name":"术师芯片","goldCost":0,"costs":[{"id":"3241","name":"狙击芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3211","name":"先锋芯片","goldCost":0,"costs":[{"id":"3271","name":"辅助芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3271","name":"辅助芯片","goldCost":0,"costs":[{"id":"3211","name":"先锋芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3221","name":"近卫芯片","goldCost":0,"costs":[{"id":"3281","name":"特种芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3281","name":"特种芯片","goldCost":0,"costs":[{"id":"3221","name":"近卫芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3232","name":"重装芯片组","goldCost":0,"costs":[{"id":"3262","name":"医疗芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3262","name":"医疗芯片组","goldCost":0,"costs":[{"id":"3232","name":"重装芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3242","name":"狙击芯片组","goldCost":0,"costs":[{"id":"3252","name":"术师芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3252","name":"术师芯片组","goldCost":0,"costs":[{"id":"3242","name":"狙击芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3212","name":"先锋芯片组","goldCost":0,"costs":[{"id":"3272","name":"辅助芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3272","name":"辅助芯片组","goldCost":0,"costs":[{"id":"3212","name":"先锋芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3222","name":"近卫芯片组","goldCost":0,"costs":[{"id":"3282","name":"特种芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3282","name":"特种芯片组","goldCost":0,"costs":[{"id":"3222","name":"近卫芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"31024","name":"炽合金块","goldCost":300,"costs":[{"id":"30063","name":"全新装置","rarity":2,"count":1},{"id":"30093","name":"研磨石","rarity":2,"count":1},{"id":"31023","name":"炽合金","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"31014","name":"聚合凝胶","goldCost":300,"costs":[{"id":"30043","name":"异铁组","rarity":2,"count":1},{"id":"31013","name":"凝胶","rarity":2,"count":1},{"id":"31023","name":"炽合金","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30145","name":"晶体电子单元","goldCost":400,"costs":[{"id":"31034","name":"晶体电路","rarity":3,"count":1},{"id":"31014","name":"聚合凝胶","rarity":3,"count":2},{"id":"31024","name":"炽合金块","rarity":3,"count":1}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"31034","name":"晶体电路","goldCost":300,"costs":[{"id":"31033","name":"晶体元件","rarity":2,"count":2},{"id":"31013","name":"凝胶","rarity":2,"count":1},{"id":"31023","name":"炽合金","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"31044","name":"精炼溶剂","goldCost":300,"costs":[{"id":"31043","name":"半自然溶剂","rarity":2,"count":1},{"id":"31053","name":"化合切削液","rarity":2,"count":1},{"id":"31013","name":"凝胶","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"31054","name":"切削原液","goldCost":300,"costs":[{"id":"31053","name":"化合切削液","rarity":2,"count":1},{"id":"31033","name":"晶体元件","rarity":2,"count":1},{"id":"30103","name":"RMA70-12","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609}]

It is generated by the following script, with building_data.json and item_table.json.

const fs = require("fs");

const building_data_json = JSON.parse(fs.readFileSync("./building_data.json", "utf8"));
const item_table_json = JSON.parse(fs.readFileSync("./item_table.json", "utf8"));

const items = item_table_json.items;
const rawFormulas = building_data_json.workshopFormulas;
const newFormulas = Object.entries(rawFormulas).map(([, formula]) => {
  let costs = formula.costs.map((costItem) => ({
    id: costItem.id,
    name: items[costItem.id].name,
    rarity: items[costItem.id].rarity,
    count: costItem.count,
  }));
  let extraOutcome = formula.extraOutcomeGroup.map((extraOutcomeItem) => ({
    id: extraOutcomeItem.itemId,
    name: items[extraOutcomeItem.itemId].name,
    rarity: items[extraOutcomeItem.itemId].rarity,
    count: extraOutcomeItem.itemCount,
    weight: extraOutcomeItem.weight,
  }));
  let totalWeight = extraOutcome.map((extraOutcomeItem) => extraOutcomeItem.weight).reduce((a, b) => a + b, 0);
  let newFormula = {
    id: formula.itemId,
    name: items[formula.itemId].name,
    goldCost: formula.goldCost,
    costs: costs,
    extraOutcome: extraOutcome,
    totalWeight: totalWeight,
  };
  return newFormula;
});

fs.writeFileSync("./formulas.json", JSON.stringify(newFormulas, null, null));

NATS Slow Consumer Mitigation

When NATS encountered a slow consumer it will drop the message, losing the report content. This has happened before extremely rarely but still have a huge potential to go wrong in the future, especially when we migrate to the k8s cluster

Report Z-test Validations & `DropInfo` Self-adoption

Currently there's only several simple and, if not naive, approaches on report validation. Previously we've proposed Z-test mechanism, and implemented on the previous backend. However, due to the MongoDB evaluation bottleneck existing on the previous backend, we unfortunately have to disable such feature due to high performance drawbacks.

The backend-next project now has the capability on both flexibility and performance extensibility to allow us relaunch such mechanism on checking the reports.

Moreover, currently the DropInfo section is somewhat artificially decided and might not be suitable for the first several hundred reports, due to the nature that we can't predict what is actually the finite set of drop possibilities, so there previously have existed several issues related to DropInfo not being applied properly at the first, causing potentially deviations for the dataset. Although we've been fixing those actively manually, those are time-consuming and as well not an optimal solution at all. Therefore, there could also be a mechanism where DropInfo itself could adopt continuously with the growth of the report dataset. However the implementation detail of the adoption is still a huge topic to discuss.


Just to note down here that, those statistics-based tests are all pretty susceptible to attacks where the attacker could aim to report several hundred or about a thousand of false reports after the very first moments the stage opens, causing the dataset to converge to a skewed result. Any results afterwards would consider invalid and therefore rejecting the true reports. Such attack could be mitigated by either randomly picking reports across different accounts, IPs, and carefully designing the threshold when Z-test kicks in, to minimize the effect such attack could bring.

"Report Count as X-axis" mode in Trend

For an activity that is just opened, the users care more about how will the drop rates of this item in the current activity be. To give them the fastest way to understand this and also give a better way of how the samples finally rest around a particular rate.

Besides only reporting the count of accumulated quantity, an accumulated standard_deviation should also be calculated so that visualization on confidence intervals could be easily visualized, assuming the drop rate across different stage clears is a binomial distribution.

Compose `CONTRIBUTING.md`

Add instructions and briefs on how to contribute to this project so new contributors know where to start.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.